HTTP通信では、リクエストのボディは重要な役割を果たしています。しかし、GETメソッドの場合、HTTPボディを使わずURLパラメータでデータを渡すのが一般的です。本記事では、GETとボディの関係、GETのデータ渡し方などについて解説した上、GETメソッドでHTTPボディを本当に使用できないのかについても考察していきたいと思います。
GETメソッドとは、HTTP Body(ボディ)との関係は?
GETメソッドは一番汎用されているHTTPメソッドとして、サーバーからデータを取得するために利用されることが多いのです。サーバーから特定のデータを取得するために、URLパラメータを使用してデータを渡すのが一般的になります。だから、原則としてGETメソッドがリクエストボディを持つことはありません。

GETメソッドでのデータの渡し方
GETリクエストは一般的にHTTPボディの代わりにパラメータを使用してサーバーにデータを渡しています。使用可能なパラメータには主に以下のようなタイプがあります。
- クエリパラメータ
URLの?以降にキーと値の形式で指定するパラメータ。
例: ?id=1234&name=abc
- パスパラメータ
URLのパスの一部として指定するパラメータ。
例: /items/{id} の {id} 部分
- ヘッダーパラメータ
リクエストヘッダーに指定するパラメータ。
例: X-Custom-Header: value
- クッキーパラメータ
Cookieヘッダーで指定するパラメータ。
例: Cookie: id=1234; name=abc
この中で、クエリパラメータが最も一般的ですが、APIの設計などで状況に応じてこれらのパラメータを使い分けます。これらのパラメータを使用してデータを渡すときに、URLエンコードに注意する必要があります。例えば、特殊文字は%エンコードする必要があります。また、GETメソッドのパラメータは直接にURLの後ろに追加するので、ブラウザやWebサーバーのURL最大長を超えないようにURLの長さ制限に気をつける必要があります。
GETメソッドは基本的にHTTP Bodyを使用しない
上記のように、GETの特性やパラメータの基本情報を理解した上で、GETリクエストは一般的にクエリパラメータやパスパラメータを利用してデータを渡していることで、GETメソッドは基本的にHTTP Bodyを使用しないことがわかりますね。
HTTPリクエストボディを使用して、データをサーバーに送信する必要がある場合は、POSTメソッドなどの他のHTTPメソッドを利用するのが適切です。
GETメソッドは基本的にリクエストボディを使用しない原因
それでは、なぜかGETメソッドはHTTPボディを使用しませんか?次は、GETメソッドがリクエストボディを利用しない主な理由を紹介します。
HTTPの仕様上の制限
- HTTPの仕様では、GETメソッドのリクエストは再送信が安全でなければならないと定められている
- リクエストボディがあると、再送信時に意図しない副作用が発生する可能性がある
イデンポテンシーの保証
- GETメソッドは「同じGETリクエストを繰り返しても結果が変わらない」イデンポテンシーを保証する必要がある
- リクエストボディがあるとイデンポテンシーが損なわれる可能性がある
キャッシュの実装
- GETの結果はキャッシュして再利用することが多い
- リクエストボディがあるとキャッシュが機能しない
ブックマークや共有のしやすさ
- GETリクエストのURLだけで結果を再現できることが望ましい
- リクエストボディがあるとURLのみでの再現が難しくなる
セキュリティ
- GETリクエストはログ等に記録されることがある
- リクエストボディに個人情報等が含まれるとセキュリティリスクになる
以上の原因のため、GETメソッドは基本的にリクエストボディを利用しません。
例外あり:GETメソッドでもHTTPボディを利用する
ただし、GETメソッドでは必ずHTTPボディを使用していけないわけでもありません。以下のような場合にはGETメソッドでもリクエストボディを送信することがあります。
検索条件を指定する場合
- 検索キーワードなどをリクエストボディに含めて送信することがある
APIでのパラメータ送信
- REST APIなどで、GETメソッドのクエリパラメーターの数が制限される場合に、代わりにリクエストボディを使用することがある
リクエストスマグリング
- トラフィック解析を妨害するために、偽のリクエストボディを送信することがある
ということで、GETメソッドは原則としてリクエストボディを利用しませんが、必ずしもそうではありません。検索条件を指定する必要がある場合など、例外となります。また、HTTPボディを使用してデータを送信する場合は、POSTやPUTなどのメソッドを利用するのが普通です。
Apidog:全てのHTTPメソッドにも全面的にご対応
それでは、GETやPOSTなどのメソッドを使って、HTTPボディでデータを送信したい場合、どうしたらいいですか?Apidogという優れていたAPI管理ツールは、全てのHTTPメソッドにも全面的に対応できるので、HTTPリクエストを送信する時にいずれかのHTTPメソッドを指定したり、HTTPボディを利用するかどうかを選択したりすることができます。また、自分でAPIを開発する場合は、APIの設計だけではなく、APIの仕様書生成、テスト自動化、データモックなど、様々な機能もできます。
Apidogでは、GETやPOSTを含む様々なHTTPメソッドにも対応できます。どちらのWeb APIもHTTPプロトコルを使用していますので、目的別で、HTTPメソッドを選択する必要があります。HTTPメソッドといえば、常に下記のものがあります。
- GET(コンテンツを取得)
- POST(コンテンツを新規追加)
- PUT(既存コンテンツを変更)
- DELETE(コンテンツを削除)

HTTPメソッドのドロップダウンリストから希望のメソッドを選択することもできますし、HTTPボディを利用したい場合、Requestパラメータの「Body」タブに切り替えて簡単に利用できます。
まとめ
GETメソッドは一般的にHTTPボディを使用せずに、URLパラメータやヘッダーなどでデータを渡しています。その理由としては、HTTPの仕様、イデンポテンシーの保証、キャッシュなどがあります。
ただし、特定のケースではGETメソッドでもHTTPボディを使用する場合がある
データを送信する際のHTTPメソッドの選択は、RESTの原則に従って適切に行う必要があると考えられています。
また、Apidogは全てのHTTPメソッドに対応しており、HTTPボディを利用するか、しないかを柔軟に設定できるので、どのようなAPIリクエストを送信するのに便利なツールになります。