前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

httprouterのCORS対策

課題

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 は本番では無効にする。