Si no desea anular su enrutador (si no tiene su aplicación configurada de una manera que lo admita, o si desea configurar CORS ruta por ruta), agregue un controlador de OPCIONES para manejar la solicitud previa al vuelo .
Es decir, con Gorilla Mux tus rutas se verían así:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Tenga en cuenta que además de nuestro controlador POST, estamos definiendo un controlador de método OPTIONS específico .
Y luego, para manejar el método de verificación previa OPTIONS, puede definir CuentasCreatePreFlight de la siguiente manera:
// Check the origin is valid.
origin := r.Header.Get("Origin")
validOrigin, err := validateOrigin(origin)
if err != nil {
return err
}
// If it is, allow CORS.
if validOrigin {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "POST")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
Lo que realmente hizo que todo esto fuera un clic para mí (además de comprender realmente cómo funciona CORS) es que el Método HTTP de una solicitud de verificación previa es diferente del Método HTTP de la solicitud real. Para iniciar CORS, el navegador envía una solicitud de verificación previa con las OPCIONES del Método HTTP, que debe manejar explícitamente en su enrutador, y luego, si recibe la respuesta adecuada"Access-Control-Allow-Origin": origin
(o "*" para todos) de su aplicación, inicia la aplicación real solicitud.
También creo que solo puede hacer "*" para los tipos estándar de solicitudes (es decir: GET), pero para otros tendrá que establecer explícitamente el origen como lo hice anteriormente.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")