ボディを一言でいうと
HTTP のボディは
「実際にやり取りしたい“中身そのもの”が入る場所」
です。
ヘッダーが「説明書」だとしたら、
ボディは「商品そのもの」。
ユーザー情報の JSON、HTML のページ、画像ファイル、フォームの内容など、
本当に送りたいデータ本体 がここに入ります。
HTTP メッセージの中でのボディの位置づけ
リクエストとレスポンスの構造
HTTP メッセージは、ざっくりこういう構造でした。
- スタートライン(リクエストライン/ステータスライン)
- ヘッダー
- 空行
- ボディ
リクエストの例です。
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{"name":"Alice","email":"alice@example.com"}
HTTP上の JSON 部分が「ボディ」です。
レスポンスならこうです。
HTTP/1.1 200 OK
Content-Type: application/json
{"id":1,"name":"Alice","email":"alice@example.com"}
HTTPここでも、最後の JSON がボディです。
ボディは必須ではありません。
GET のように「読むだけ」のリクエストでは、ボディがないことも多いです。
ボディの役割その1:サーバーに「データを渡す」
典型例:ユーザー登録(POST)
ユーザー登録を考えてみましょう。
フォームに入力した内容をサーバーに送りたいとき、
その「入力内容」がボディに入ります。
POST /api/users HTTP/1.1
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com",
"password": "secret"
}
HTTP意味は
「この JSON の内容で新しいユーザーを作ってください」
です。
Java(Spring)側では、こう受け取ります。
@PostMapping("/api/users")
public UserResponse create(@RequestBody UserRequest request) {
var user = userService.register(request);
return UserResponse.from(user);
}
Javaここで @RequestBody が、
「HTTP のボディに入っている JSON を UserRequest にマッピングしてね」
という意味です。
ポイント:
“複雑なデータ”や“機密情報”は、URL ではなくボディに載せる。
クエリパラメータにパスワードを載せるのは絶対にやめましょう。
ボディの役割その2:クライアントに「データを返す」
典型例:JSON を返す API
REST API では、レスポンスボディに JSON を入れて返すのが定番です。
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
HTTPJava(Spring)では、
コントローラの返り値にオブジェクトを返すと、
それを JSON に変換してボディに詰めてくれます。
@GetMapping("/api/users/{id}")
public UserResponse get(@PathVariable Long id) {
var user = userService.find(id);
return UserResponse.from(user);
}
Javaここで UserResponse がそのままボディの中身(JSON)になります。
HTML やファイルもボディに入る
ブラウザで普通の Web ページを開くときも、
HTML はレスポンスボディに入っています。
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>...</html>
HTTP画像や PDF をダウンロードするときも、
そのバイナリデータがボディに入ります。
ボディは「形式を問わず、データ本体を入れる箱」
だとイメージしておくとよいです。
ボディとヘッダーの関係
「中身」と「中身の説明」
ボディ:
実際のデータ本体(JSON、HTML、画像、フォームデータなど)
ヘッダー:
そのデータの説明(Content-Type, Content-Length など)
例えば、JSON を返すときはこうです。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 52
{"id":1,"name":"Alice","email":"alice@example.com"}
HTTPContent-Type を見て、
クライアントは「これは JSON だな」と理解し、
ボディを JSON としてパースします。
重要:
ボディだけあっても、ヘッダーで「これは何か」を伝えないと、
相手は正しく解釈できない。
逆に、ヘッダーだけあっても、中身(ボディ)がなければ意味がない。
どのメソッドでボディを使うことが多いか
よくボディを持つメソッド
POST:
新規作成や処理実行のためのデータをボディに載せることが多い。
PUT:
リソースの「新しい完全な状態」をボディに載せる。
PATCH:
部分更新したいフィールドをボディに載せる。
あまりボディを使わないメソッド
GET:
基本はボディなし(条件はクエリパラメータ)。
※仕様上はボディを付けてもよいが、実務ではほぼ使わない。
DELETE:
対象はパスパラメータで特定するので、ボディなしが多い。
設計の目安:
“何かを送ってサーバーに処理してほしい”ときはボディを使う。
“ただ見たいだけ”の GET は、ボディではなくパスやクエリで表現する。
Java 開発者視点での「ボディの押さえどころ」
リクエストボディ:@RequestBody と DTO
クライアントから JSON を受け取るときは、@RequestBody と DTO クラスの組み合わせが基本パターンです。
public class UserRequest {
private String name;
private String email;
// getter / setter
}
Java@PostMapping("/api/users")
public UserResponse create(@RequestBody UserRequest request) {
...
}
Javaここで大事なのは、
「ボディの構造(JSON)を、自分で設計する」
という意識です。
どんなフィールドを持たせるか
必須項目は何か
クライアントに見せたくない内部情報は入れていないか
ボディの設計は、そのまま「API の顔」になります。
レスポンスボディ:返り値とシリアライズ
レスポンスボディは、
コントローラの返り値のクラス設計に直結します。
エンティティをそのまま返すのではなく、
レスポンス専用の DTO(UserResponse など)を用意する
のが実務ではよくあるパターンです。
これにより、
「外部に見せる項目」と「内部のドメインモデル」を分離できます。
初心者向けまとめ:ボディの役割を自分の言葉で説明するなら
あなたの言葉で整理すると、こうなります。
HTTP のボディは、
リクエストやレスポンスの「中身そのもの」が入る場所で、
JSON・HTML・画像・フォームデータなど、
本当にやり取りしたいデータ本体を運ぶ役割を持つ。
ヘッダーはその中身の説明(Content-Type など)、
ボディは中身そのもの。
Java(Spring)では、
リクエストボディは @RequestBody で DTO にマッピングし、
レスポンスボディは返り値のオブジェクトを JSON などにシリアライズして返す。
もしよければ、
「ユーザー登録 API」と「ユーザー取得 API」を題材にして、
それぞれのリクエストボディ・レスポンスボディの JSON を
自分の手で書き出してみよう。
その形を自分で説明できるようになったとき、ボディはもう“黒い箱”ではなく、“あなたがデザインするデータ”になっているはず。
