はじめに
Web APIを開発する場合、必要なパラメータを取得する方法はいくつか存在します。
- URLパラメータ
- リクエストヘッダ
- リクエストボディ
リクエストの最後の部分が本文です。本文が存在しないリクエストもあります。リソースを取り込むリクエストである GET, HEAD, DELETE, OPTIONS は通常、本文は不要です。サーバー内のデータを更新するためにデータを送信するリクエストもあり、 POST リクエストでよくあります (HTML フォームのデータを持つ)。
参考: https://developer.mozilla.org/ja/docs/Web/HTTP/Messages#body
GETでリクエストボディを利用したらどうなるか
そもそもGETメソッドはリソースを取り込むリクエストであるため、リクエストボディを用いなくても要件を実現できるはずですが、実装次第ではリクエストボディを用いることができてしまいます。
ここでは、GETメソッドでリクエストボディを利用した場合のケースを解説します。
実例
実際の開発現場で書かれていたコード例を紹介します。
class UsersController
def index
user_params
end
private
def user_params
params.require(:user).permit(:name)
end
end
通常、ストロングパラメータはリソースを取り込むリクエストであるGETメソッドで不要です。
このようなコードを書いてしまうと、
curl http://localhost:3000/users/?name=Taro
というようなリクエストではなく、
curl -H "Content-Type: application/json" -d '{"name":"Taro"}' http://localhost:3000/users/
というような、GETメソッドなのにリクエストボディを要求するというAPIになってしまいます。
これは、ActionController::ParamsWrapper
がデフォルトで、application/json
を受け付けていることに起因しています。
config/initializers/wrap_parameters.rb
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end