Jeśli nie chcesz zastąpić routera (jeśli nie masz aplikacji skonfigurowanej w sposób, który to obsługuje lub chcesz skonfigurować CORS na podstawie trasy po trasie), dodaj obsługę OPTIONS do obsługi żądania przed lotem .
To znaczy, z Gorilla Mux Twoje trasy wyglądałyby tak:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Zauważ powyżej, że oprócz naszej obsługi POST, definiujemy konkretną procedurę obsługi metody OPTIONS .
A następnie, aby faktycznie obsłużyć metodę preflight OPTIONS, możesz zdefiniować AccountsCreatePreFlight w następujący sposób:
// 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")
}
To, co naprawdę sprawiło, że to wszystko kliknęło dla mnie (oprócz faktycznego zrozumienia, jak działa CORS), to fakt, że metoda HTTP żądania inspekcji wstępnej różni się od metody HTTP rzeczywistego żądania. Aby zainicjować CORS, przeglądarka wysyła żądanie inspekcji wstępnej z opcjami metody HTTP, które należy obsługiwać jawnie na routerze, a następnie, jeśli otrzyma odpowiednią odpowiedź "Access-Control-Allow-Origin": origin
(lub „*” dla wszystkich) z aplikacji, inicjuje rzeczywistą żądanie.
Uważam również, że możesz zrobić "*" tylko dla standardowych typów żądań (np.: GET), ale dla innych będziesz musiał jawnie ustawić źródło, tak jak ja powyżej.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")