課題
GoでhttprouterでWebサービスを書いている際、Swagger EditorからPOST処理の接続テストを行おうとしたところ、
クロスドメインアクセス問題で405エラーが発生した。どうすれば良いか。
対策
SwaggerはPOSTリクエスト送信前にOPTIONSメソッドを使って有効なメソッドのチェックを行っている。
なのでhttprouter側でOPTIONSメソッドが呼ばれた際のCORS処理を別途記述する必要がある。
リクエストパスごとにOPTIONSを書くのは面倒なので、1箇所にまとめてしまう
func handleOption(w http.ResponseWriter, r *http.Request, p httprouter.Params) { w.Header().Add("Access-Control-Allow-Origin", "http://localhost:8080") w.Header().Set("Access-Control-Allow-Methods", "*") w.Header().Add("Access-Control-Allow-Headers", "Content-Type") w.Header().Add("Access-Control-Allow-Headers", "Origin") w.Header().Add("Access-Control-Allow-Headers", "X-Requested-With") w.Header().Add("Access-Control-Allow-Headers", "Accept") w.Header().Add("Access-Control-Allow-Headers", "Accept-Language") w.Header().Set("Content-Type", "application/json") }
ルーティング処理。OPTIONSは/*pathでまとめて扱う。pathの文字列は任意で良いが、ないとエラーになる。
router := httprouter.New() router.OPTIONS("/*path", handleOption)
Access-Control-Allow-Origin は本番では無効にする。