En este post te mostraré cómo habilitar o permitir CORS en Go cuando se usa Gorilla Mux, un enrutador de Go.
Funciones para habilitar CORS
Para hacer esto, necesitamos colocar un middleware que agregue ciertos encabezados a la petición y después llame a la siguiente función.
Primero veamos las dos funciones, toma en cuenta que estamos configurando el dominio http://localhost, es decir, se permitirán las llamadas desde ese dominio (puedes cambiarlo en tu caso):
func enableCORS(router *mux.Router) {
router.PathPrefix("/").HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "http://localhost")
}).Methods(http.MethodOptions)
router.Use(middlewareCors)
}
func middlewareCors(next http.Handler) http.Handler {
return http.HandlerFunc(
func(w http.ResponseWriter, req *http.Request) {
// Just put some headers to allow CORS...
w.Header().Set("Access-Control-Allow-Origin", "http://localhost")
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
// and call next handler!
next.ServeHTTP(w, req)
})
}
Como puedes ver, son dos. Una de ellas agrega el encabezado de Access-Control-Allow-Origin
para el método OPTIONS
(tuve que agregarlo para evitar problemas al usar fetch en JavaScript) y la otra función agrega ese encabezado además de otros para todas las demás peticiones.
Usar middleware de CORS en Mux
Ahora que tenemos definida la función, solo debemos invocar a enableCors
pasándole el enrutador de Go con Mux. Si, por ejemplo, tenemos nuestro router así:
router := mux.NewRouter()
Debemos invocar a la función así:
// First enable CORS. If you don't need cors, comment the next line
enableCORS(router)
Todo esto se puede ver en uso en la API de Go con MySQL.