ルーターを上書きしたくない場合(これをサポートする方法でアプリを構成していない場合、またはルートごとにCORSを構成する場合)、飛行前のリクエストを処理するOPTIONSハンドラーを追加します。
つまり、Gorilla Muxを使用すると、ルートは次のようになります。
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
上記のPOSTハンドラーに加えて、特定のOPTIONSメソッドハンドラーを定義していることに注意してください。
次に、OPTIONSプリフライトメソッドを実際に処理するには、次のようにAccountsCreatePreFlightを定義します。
// 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")
}
(CORSがどのように機能するかを実際に理解することに加えて)これを本当にクリックしたのは、プリフライトリクエストのHTTPメソッドが実際のリクエストのHTTPメソッドとは異なるということです。CORSを開始するために、ブラウザーはHTTPメソッドOPTIONSを使用してプリフライトリクエストを送信します。これはルーターで明示的に処理する必要があり"Access-Control-Allow-Origin": origin
、アプリケーションから適切な応答(または「*」すべて)を受信した場合、実際のリクエスト。
また、標準タイプのリクエスト(つまり、GET)に対してのみ「*」を実行できると信じていますが、他のリクエストについては、上記のように明示的にオリジンを設定する必要があります。
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")