Se você não deseja substituir seu roteador (se você não tiver seu aplicativo configurado de uma maneira que ofereça suporte a isso, ou desejar configurar o CORS em uma rota por rota), adicione um manipulador de OPTIONS para lidar com a solicitação de pré-vôo .
Ou seja, com o Gorilla Mux, suas rotas se pareceriam com:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Observe acima que, além de nosso manipulador POST, estamos definindo um manipulador de método OPTIONS específico .
E, para lidar com o método de comprovação OPTIONS, você pode definir AccountsCreatePreFlight da seguinte maneira:
// 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")
}
O que realmente fez tudo isso clicar para mim (além de realmente entender como o CORS funciona) é que o método HTTP de uma solicitação de comprovação é diferente do método HTTP da solicitação real. Para iniciar o CORS, o navegador envia uma solicitação de comprovação com o método HTTP OPTIONS, que você precisa manipular explicitamente no roteador e, em seguida, se receber a resposta apropriada"Access-Control-Allow-Origin": origin
(ou "*" para todos) do seu aplicativo, inicia a real solicitação.
Eu também acredito que você só pode fazer "*" para tipos padrão de solicitações (por exemplo: GET), mas para outros você precisará definir explicitamente a origem, como eu faço acima.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")