3秒でわかる
HTTP リクエストのうち、送るデータ本体が入る部分。POST や PUT で登録内容や更新内容を運び、形式は Content-Type ヘッダで示します。
もう少し詳しく
どういうものか
リクエストボディは、HTTP リクエストの本文にあたる部分である。リクエストはリクエストライン、ヘッダ、空行、ボディの順に並び、この最後がボディになる。
中身の形式は決まっておらず、何で書いてあるかを Content-Type ヘッダで伝える。Web API では application/json が最も多く、HTML のフォーム送信では application/x-www-form-urlencoded、ファイル添付を含む場合は multipart/form-data が使われる。
なぜ必要か
URL に載せられる情報には限りがある。クエリ文字列は長さの上限が実装依存で数千文字しかなく、アクセスログやブラウザの履歴にそのまま残り、リファラとして外部へ漏れることもある。
そのため、新規登録の入力内容やパスワードのような、長さがあり残ってほしくないデータはボディで送る。画像のようなバイナリはそもそもクエリ文字列に載せられない。
具体例
送る側と受ける側を並べる。
// 送る側 ── Content-Type と body の形式を合わせる
const res = await fetch("/api/orders", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ itemId: 12, quantity: 3 }),
});// 受ける側 (Express) ── パーサを入れて初めて req.body に入る
import express from "express";
const app = express();
app.use(express.json()); // これが無いと req.body は undefined
app.post("/api/orders", (req, res) => {
const { itemId, quantity } = req.body;
if (!Number.isInteger(quantity) || quantity < 1) {
return res.status(400).json({ message: "quantity は 1 以上の整数で指定してください" });
}
res.status(201).json({ id: 987, itemId, quantity });
});つまずきやすいところ
req.body が undefined になる相談が最も多い。原因はたいてい 2 つで、express.json() を入れていないか、送信側の Content-Type が付いていないかである。パーサはヘッダを見て動くので、ヘッダが無い JSON は素通りする。
body に JavaScript のオブジェクトをそのまま渡すのも定番の誤りになる。JSON.stringify() を通さないと [object Object] という文字列が飛ぶ。
multipart/form-data で送る場合は逆に、Content-Type を自分で書いてはいけない。FormData を body に渡すと境界文字列を含むヘッダがブラウザ側で自動生成されるため、手で上書きすると壊れる。
似た用語との違い
| 運び方 | 書く場所 | 主な用途 |
|---|---|---|
| リクエストボディ | 本文 | 登録・更新するデータ、ファイル |
| クエリパラメータ | URL の ? 以降 | 検索条件、絞り込み、ページ番号 |
| パスパラメータ | URL の一部 | 対象の識別子 (/users/42 の 42) |
| ヘッダ | ヘッダ行 | 認証情報、形式の指定 |
GET と DELETE にもボディを付けること自体は可能だが、途中の経路で捨てられることがあるため実務では使わない。