43

だから私は Go でこの RESTful バックエンドを書いています。これは、クロスサイト HTTP リクエストで呼び出されます。つまり、別のサイトによって提供されるコンテンツから呼び出されます (実際には、別のポートですが、同じオリジン ポリシーが適用されます)。 .

このシナリオでは、ユーザー エージェントは場合によっては、プリフライト OPTIONS リクエストを送信して、実際のリクエストが安全に送信できるかどうかを確認します。

私の質問は、Go コンテキストでこれらのプリフライト リクエストをどのように処理し、適切に応答するかということです。私が思いついた方法はあまりエレガントではありません。私が思いもよらなかった方法が他にあるのではないかと考えています。

標準net/httpパッケージを使用すると、おそらく次のように、ハンドラー func でリクエスト メソッドを確認できます。

func AddResourceHandler(rw http.ResponseWriter, r *http.Request) {
  switch r.Method {
  case "OPTIONS":
    // handle preflight
  case "PUT":
    // respond to actual request
  }
}

また、 Gorilla の パッケージを使用muxして、関連する URL パスごとにプリフライトの「OPTIONS」ハンドラーを登録することもできます。

r := mux.NewRouter()
r.HandleFunc("/someresource/item", AddResourceHandler).Methods("PUT")
r.HandleFunc("/someresource/item", PreflightAddResourceHandler).Methods("OPTIONS")

おそらく、この質問に対する答えは単純です:うん、それらはあなたの基本的なオプションです. しかし、私が気付いていないベストプラクティスがいくつかあるのではないかと思いました。

4

5 に答える 5

6

gorilla/handlersには素敵な CORS ハンドラもあります: cors.go

使用例:

import (
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/users", UserEndpoint)
    r.HandleFunc("/projects", ProjectEndpoint)

    // Apply the CORS middleware to our top-level router, with the defaults.
    http.ListenAndServe(":8000", handlers.CORS()(r))
}
于 2016-11-07T14:33:55.710 に答える