最近rails routes
を実行したときに、見慣れないHTTP OPTIONSリクエストのルーティングを目にしたので調べました。
よくあるルーティング
Railsではresources
メソッドを使うことで、あるリソースを操作するコントローラの各アクションにリクエストをマッピングできます。
Rails.application.routes.draw do
resources :products
end
resources
メソッドでは GET
、POST
、PATCH
、PUT
、DELETE
リクエストに対するルーティングは作成されますが、OPTIONS
メソッドのようにリソースを操作しないリクエストのルーティングは作成されません。
OPTIONSメソッドとは
HTTP の OPTIONSメソッドは、指定された URL またはサーバーの許可されている通信オプションをリクエストします。
レスポンスには、許可されているメソッドを含んだ Allow ヘッダーが入ります。
> curl -X OPTIONS https://example.org -i
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
CORS では、プリフライトリクエストを OPTIONS メソッドで送信すると、サーバーはリクエストを送信して受け付けられるかどうかを応答できるようにします。
CORSリクエスト前のプリフライトリクエスト以外にも、APIのリクエスト/レスポンスのJSON schemaを公開するために使用するケースもあるようです。
OPTIONSリクエストをルーティングする方法
match
メソッドと:via
オプションを使うことでOPTIONSリクエストにマッチするルーティングを作成できます。
match '/products/:id', to: 'products#option', via: :options
OPTIONS /products/:id(.:format) products#option
リソースベースのルーティングにOPTIONSリクエストのルーティングを追加するときは、collectionやmemberブロック内に記述します。
Rails.application.routes.draw do
resources :products do
collection do
match '', via: :options, action: :option
end
end
end
追加されるルーティングは以下のようになります。
OPTIONS /products(.:format) products#option
参考
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#simple_requests
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/OPTIONS