0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】GETでリクエストボディを利用しない方がよい理由

Last updated at Posted at 2021-12-19

はじめに

Web APIを開発する場合、必要なパラメータを取得する方法はいくつか存在します。

  1. URLパラメータ
  2. リクエストヘッダ
  3. リクエストボディ

リクエストの最後の部分が本文です。本文が存在しないリクエストもあります。リソースを取り込むリクエストである 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?