HTTP Request Body:完全ガイド(2026年版)
リクエストボディ、content types、およびHTTPでデータを送信する方法について理解しましょう。
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
HTTP Request Body: 完全ガイド (2026年版)
HTTPリクエストボディは、サーバーに送信したいデータを格納するHTTPリクエストの一部です。フォームの送信、ファイルのアップロード、APIの呼び出しなど、リクエストボディを理解することはウェブ開発やAPI連携において極めて重要です。
本ガイドでは、HTTPリクエストボディに関するあらゆる知識を網羅します。その定義、使用場面、コンテンツタイプの種類、そして様々なツールやプログラミング言語を使用した正しい送信方法について解説します。
HTTP Request Body とは何か?
HTTPリクエストは、以下の3つのパートで構成されています。
- Request line(リクエスト行) - メソッド(GET、POSTなど)とURL
- Headers(ヘッダー) - リクエストに関するメタデータ
- Body(ボディ) - 実際のデータペイロード(任意)
ボディは、サーバーに送信したいデータを配置する場所です。すべてのHTTPメソッドがボディを使用するわけではありません。
ボディを使用するHTTPメソッドは?
| メソッド | ボディの有無 | 主なユースケース |
|---|---|---|
| GET | なし(技術的に可能だが非推奨) | データの取得 |
| POST | あり | リソースの作成、データの送信 |
| PUT | あり | リソースの完全な置換 |
| PATCH | あり | リソースの部分的な更新 |
| DELETE | まれにあり(許容されるが一般的ではない) | リソースの削除 |
| HEAD | なし | GETと同様だがレスポンスボディなし |
| OPTIONS | なし | CORSプリフライトチェック |
Content-Type ヘッダーは、ボディがどのようなフォーマットであるかをサーバーに伝えます。このヘッダーなしでボディを送信すると、サーバーはデータの解析方法を判断できない場合があります。
コンテンツタイプの解説
リクエストボディを送信する際、Content-Type ヘッダーは非常に重要です。以下は最も一般的なタイプです。
1. application/json
現代のAPIで最も一般的な形式です。データは JSON 文字列として送信されます。
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
2. application/x-www-form-urlencoded
HTMLフォーム送信のデフォルト形式です。データは & で区切られたキーと値のペアとしてエンコードされます。
Content-Type: application/x-www-form-urlencoded
name=Alice&email=alice%40example.com&age=30
特殊文字はパーセントエンコーディングされます(例: @ は %40 に変換)。
3. multipart/form-data
ファイルのアップロードや、バイナリデータを含むフォームで使用されます。各フィールドは境界文字列(boundary)によって区切られます。
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
Alice
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="photo.jpg"
Content-Type: image/jpeg
(binary data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
4. text/plain
特別なエンコーディングのないプレーンテキストです。
Content-Type: text/plain
This is just plain text content.
5. application/xml
XML 形式のデータで、エンタープライズAPIや SOAP サービスでは依然として一般的です。
Content-Type: application/xml
<user>
<name>Alice</name>
<email>alice@example.com</email>
<age>30</age>
</user>
コンテンツタイプの比較
| コンテンツタイプ | 最適な用途 | ファイル対応 | 可読性 | サイズ |
|---|---|---|---|---|
| application/json | API | 不可 (base64が必要) | あり | 小〜中 |
| application/x-www-form-urlencoded | シンプルなフォーム | 不可 | ややあり | 小 |
| multipart/form-data | ファイルアップロード | あり | なし | 制限なし |
| text/plain | 生テキスト | 不可 | あり | 小〜中 |
| application/xml | エンタープライズAPI | 不可 (base64が必要) | あり | 中〜大 |
リクエストボディの送信方法:実践例
cURL を使用する場合
JSON ボディ:
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "email": "alice@example.com"}'
フォームエンコードされたボディ:
curl -X POST https://api.example.com/users \
-d "name=Alice&email=alice@example.com"
cURL でコンテンツタイプを指定せずに -d を使用すると、自動的に Content-Type: application/x-www-form-urlencoded が設定されます。
ファイルアップロード (multipart):
curl -X POST https://api.example.com/upload \
-F "file=@photo.jpg" \
-F "description=Profile photo"
-F フラグを使用すると、コンテンツタイプは自動的に multipart/form-data に設定されます。
ファイルからボディを読み込む:
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d @payload.json
JavaScript (fetch) を使用する場合
JSON ボディ:
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Alice',
email: 'alice@example.com',
}),
});
const data = await response.json();
フォームデータ:
const formData = new FormData();
formData.append('name', 'Alice');
formData.append('email', 'alice@example.com');
const response = await fetch('https://api.example.com/users', {
method: 'POST',
body: formData,
// Content-Type ヘッダーは設定しないでください。
// ブラウザが multipart/form-data 用の正しい境界線を自動で設定します。
});
ファイルアップロード:
const fileInput = document.querySelector('input[type="file"]');
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('description', 'Profile photo');
const response = await fetch('https://api.example.com/upload', {
method: 'POST',
body: formData,
});
Python (requests) を使用する場合
JSON ボディ:
import requests
response = requests.post(
'https://api.example.com/users',
json={'name': 'Alice', 'email': 'alice@example.com'}
)
print(response.json())
json パラメータを使用すると、自動的に Content-Type ヘッダーが設定され、データがシリアライズされます。
フォームエンコードされたボディ:
response = requests.post(
'https://api.example.com/users',
data={'name': 'Alice', 'email': 'alice@example.com'}
)
ファイルアップロード:
with open('photo.jpg', 'rb') as f:
response = requests.post(
'https://api.example.com/upload',
files={'file': ('photo.jpg', f, 'image/jpeg')},
data={'description': 'Profile photo'}
)
Node.js (標準 fetch) を使用する場合
Node.js 18以降には、組み込みの fetch API が含まれています。
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' }),
});
const data = await response.json();
よくある間違いと解決策
1. Content-Type ヘッダーの忘れ
Content-Type: application/json を設定せずに JSON を送信すると、サーバーはそれをプレーンテキストとして扱い、解析に失敗することがあります。
# 間違い - Content-Type なし
curl -X POST https://api.example.com/users \
-d '{"name": "Alice"}'
# 正解
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice"}'
2. JavaScript で FormData に Content-Type を設定してしまう
fetch で FormData を使用する場合、Content-Type ヘッダーを手動で設定しないでください。ブラウザが自動的に境界文字列(boundary)を生成する必要があります。
// 間違い - 境界文字列が上書きされてしまう
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'multipart/form-data' },
body: formData,
});
// 正解 - ブラウザに任せる
fetch(url, {
method: 'POST',
body: formData,
});
3. GET リクエストでボディを送信する
HTTP 仕様で厳密に禁止されているわけではありませんが、GET リクエストでボディを送信することは強く推奨されません。多くのサーバー、プロキシ、ライブラリで無視されたり、削除されたりします。
# バッドプラクティス
curl -X GET https://api.example.com/search \
-d '{"query": "test"}'
# ベター - クエリパラメータを使用する
curl "https://api.example.com/search?query=test"
4. JSON の二重シリアライズ
JavaScript でよくある間違いは、すでに文字列化されたオブジェクトを再度 JSON.stringify してしまうことです。
// 間違い - 二重シリアライズ
const data = JSON.stringify({ name: 'Alice' });
fetch(url, {
body: JSON.stringify(data), // 文字列がさらに引用符で囲まれてしまう
});
// 正解
fetch(url, {
body: JSON.stringify({ name: 'Alice' }),
});
リクエストボディのサイズ制限
ほとんどのサーバーやプラットフォームでは、ボディのサイズ制限を設けています。
| プラットフォーム/サーバー | デフォルト制限 |
|---|---|
| Nginx | 1 MB |
| Apache | 2 GB |
| Express.js (json) | 100 KB |
| Next.js API routes | 1 MB |
| AWS API Gateway | 10 MB |
| Cloudflare Workers | 100 MB |
| Vercel Serverless | 4.5 MB |
より大きなペイロードを送信する必要がある場合は、マルチパートアップロード、チャンク転送エンコーディング、または署名付きアップロードURL(pre-signed URLs)の使用を検討してください。
まとめ
HTTPリクエストボディを理解することは、APIやウェブアプリケーションを扱う開発者にとって不可欠です。ほとんどのAPI連携には JSON を、シンプルなフォーム送信にはフォームエンコードデータを、ファイルのアップロードにはマルチパートを使用してください。常に正しい Content-Type ヘッダーを設定し、インフラストラクチャのサイズ制限に留意しましょう。
画像生成や動画処理など、メディアデータを AI API に送信するアプリケーションを構築している場合、Hypereal AI は、AI画像生成や動画作成などのための、標準的なHTTPリクエストフォーマットを受け付ける使いやすいAPIを提供しています。
