Si vous ne souhaitez pas remplacer votre routeur (si votre application n'est pas configurée d'une manière qui prend en charge cela, ou si vous souhaitez configurer CORS route par route), ajoutez un gestionnaire OPTIONS pour gérer la demande de pré-vol .
C'est-à-dire qu'avec Gorilla Mux, vos itinéraires ressembleraient à:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Notez ci-dessus qu'en plus de notre gestionnaire POST, nous définissons un gestionnaire de méthode OPTIONS spécifique .
Et puis pour gérer réellement la méthode de contrôle en amont OPTIONS, vous pouvez définir AccountsCreatePreFlight comme suit:
// 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")
}
Ce qui a vraiment rendu tout cela cliqué pour moi (en plus de comprendre comment fonctionne CORS), c'est que la méthode HTTP d'une demande de contrôle en amont est différente de la méthode HTTP de la demande réelle. Pour lancer CORS, le navigateur envoie une requête de contrôle en amont avec OPTIONS de méthode HTTP, que vous devez gérer explicitement dans votre routeur, puis, s'il reçoit la réponse appropriée "Access-Control-Allow-Origin": origin
(ou "*" pour tous) de votre application, il lance le demande.
Je crois aussi que vous ne pouvez faire "*" que pour les types de requêtes standard (par exemple: GET), mais pour d'autres, vous devrez définir explicitement l'origine comme je le fais ci-dessus.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")