HTTP POSTメソッド:完全入門 (2026年版)
開発者が POST メソッドについて知っておくべきすべてのこと
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
HTTP POST メソッド:完全ガイド (2026年版)
HTTP POST メソッドは、Web開発において最も一般的に使用されるメソッドの1つです。これは、リソースを作成または処理するためにサーバーにデータを送信するために使用されます。データを取得する GET リクエストとは異なり、POST リクエストはデータを送信します。フォームの送信、ファイルのアップロード、API 呼び出し、認証リクエストなどはすべて POST に依存しています。
本ガイドでは、POST メソッドの仕組み、使用すべき場面、さまざまなボディ形式、複数の言語による実践的な例など、必要な知識をすべて網羅しています。
POST メソッドとは?
POST は、HTTP/1.1 仕様 (RFC 7231) で定義されている HTTP メソッドです。クライアントが POST リクエストを送信する場合、サーバーが処理すべきデータを含むボディ(本体)が含まれます。通常、サーバーは新しいリソースを作成し、その結果を示すレスポンスを返します。
POST の主な特徴:
| プロパティ | 値 |
|---|---|
| リクエストボディの有無 | あり |
| レスポンスボディの有無 | あり |
| 安全性 (Safe) | なし (サーバーの状態を変更する) |
| べき等性 (Idempotent) | なし (繰り返し呼び出すと重複が作成される可能性がある) |
| キャッシュ可能性 | 鮮度情報が含まれている場合のみ可能 |
| HTML フォームでの使用 | 可能 |
POST と他の HTTP メソッドの比較
| メソッド | 目的 | ボディの有無 | べき等性 |
|---|---|---|---|
| GET | データの取得 | なし | あり |
| POST | データの作成または処理 | あり | なし |
| PUT | リソースの完全な置換 | あり | あり |
| PATCH | リソースの部分的な更新 | あり | なし |
| DELETE | リソースの削除 | 任意 | あり |
POST を使用すべき場面:
- 新しいリソースを作成する場合 (例: 新規ユーザー、新規注文)
- フォームデータを送信する場合
- ファイルをアップロードする場合
- リクエストがべき等ではない場合 (2回呼び出すと2つのリソースが作成されるべき場合)
- データがクエリ文字列にするには大きすぎる、または機密性が高い場合
POST リクエストの構造
POST リクエストは以下の3つの部分で構成されます:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
{
"name": "Jane Doe",
"email": "jane@example.com"
}
- リクエストライン: メソッド (
POST)、パス (/api/users)、HTTP バージョン - ヘッダー: コンテンツタイプや認証情報を含む、リクエストに関するメタデータ
- ボディ: 実際に送信されるデータ
Content-Type ヘッダー
Content-Type ヘッダーは、リクエストボディをどのように解析するかをサーバーに伝えます。以下は最も一般的なタイプです:
| Content-Type | ユースケース | 例 |
|---|---|---|
application/json |
REST API | {"key": "value"} |
application/x-www-form-urlencoded |
HTML フォーム | key=value&key2=value2 |
multipart/form-data |
ファイルアップロード | 境界線(boundary)で区切られたバイナリデータ |
text/plain |
単純なテキストデータ | Hello, World |
application/xml |
SOAP/レガシー API | <root><key>value</key></root> |
POST リクエストの実装例
JavaScript (Fetch API)
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
name: 'Jane Doe',
email: 'jane@example.com',
role: 'admin'
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('Created user:', data);
Python (Requests ライブラリ)
import requests
response = requests.post(
'https://api.example.com/users',
json={
'name': 'Jane Doe',
'email': 'jane@example.com',
'role': 'admin'
},
headers={
'Authorization': 'Bearer your-api-key'
}
)
response.raise_for_status()
data = response.json()
print(f"Created user: {data}")
cURL
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"name": "Jane Doe",
"email": "jane@example.com",
"role": "admin"
}'
Node.js (Axios)
const axios = require('axios');
const { data } = await axios.post('https://api.example.com/users', {
name: 'Jane Doe',
email: 'jane@example.com',
role: 'admin'
}, {
headers: {
'Authorization': 'Bearer your-api-key'
}
});
console.log('Created user:', data);
フォームデータの取り扱い
HTML フォーム送信の場合:
<form action="/api/contact" method="POST">
<input type="text" name="name" placeholder="Your name" />
<input type="email" name="email" placeholder="Your email" />
<textarea name="message" placeholder="Your message"></textarea>
<button type="submit">Send</button>
</form>
ブラウザはこれを application/x-www-form-urlencoded としてエンコードします:
name=Jane+Doe&email=jane%40example.com&message=Hello+there
POST によるファイルアップロード
ファイルのアップロードには multipart/form-data を使用します:
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',
headers: {
'Authorization': 'Bearer your-api-key'
},
body: formData
// 注意: Content-Type ヘッダーを手動で設定しないでください。
// ブラウザが適切な boundary を含めて自動的に設定します。
});
const result = await response.json();
console.log('Upload result:', result);
Python の場合:
import requests
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'},
headers={'Authorization': 'Bearer your-api-key'}
)
print(response.json())
POST レスポンスステータスコード
| ステータスコード | 意味 | 使用場面 |
|---|---|---|
200 OK |
リクエスト成功 | 一般的な成功(レスポンスボディあり) |
201 Created |
リソース作成完了 | 新しいリソースが作成された(POSTで最も一般的) |
202 Accepted |
受付済み(処理待ち) | 非同期処理(ジョブがキューに追加された) |
204 No Content |
成功(ボディなし) | レスポンスボディが必要ない場合 |
400 Bad Request |
不正なリクエスト | バリデーションエラー、不正な形式の JSON |
401 Unauthorized |
認証エラー | 認証が必要、または無効 |
403 Forbidden |
権限不足 | 認証は有効だが、必要な権限がない |
409 Conflict |
競合 | メールアドレスの重複、ユーザー名が既に使用されている |
413 Payload Too Large |
ペイロードが大きすぎます | ファイルサイズがサーバーの制限を超えている |
422 Unprocessable Entity |
処理不可能なエンティティ | JSON 形式は正しいが、データの内容に不備がある |
429 Too Many Requests |
リクエスト過多 | レート制限(リクエストの送りすぎ) |
500 Internal Server Error |
サーバーエラー | 予期しないサーバー側の障害 |
エラーハンドリングのベストプラクティス
常にエラーを適切に処理しましょう:
async function createUser(userData) {
try {
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(userData)
});
if (response.status === 201) {
return await response.json();
}
if (response.status === 400) {
const error = await response.json();
throw new Error(`バリデーションエラー: ${error.message}`);
}
if (response.status === 409) {
throw new Error('ユーザーが既に存在します');
}
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After');
throw new Error(`レート制限がかかっています。${retryAfter}秒後に再試行してください`);
}
throw new Error(`予期しないステータス: ${response.status}`);
} catch (error) {
console.error('ユーザー作成に失敗しました:', error.message);
throw error;
}
}
セキュリティ上の考慮事項
POST エンドポイントの実装や POST リクエストの送信時には、以下のセキュリティプラクティスを念頭に置いてください:
- 常に HTTPS を使用する: 通常の HTTP では POST ボディは暗号化されません。
- サーバー側で入力を検証する: クライアント側のバリデーションだけを信用してはいけません。
- CSRF トークンを使用する: クロスサイトリクエストフォージェリからフォームを保護します。
- サイズ制限を設定する: 巨大なペイロードによる DoS 攻撃を防止します。
- アップロードファイルをサニタイズする: ファイル形式を確認し、マルウェアのスキャンを行います。
- エンドポイントのレート制限を行う: リソース作成の乱用を防止します。
よくある間違い
| 間違い | 解決策 |
|---|---|
FormData 使用時に Content-Type を設定する |
ブラウザやライブラリに自動設定させる |
| レスポンスステータスを確認しない | 常に response.ok やステータスコードを確認する |
| URL パラメータに機密データを送信する | リクエストボディを使用する |
| ネットワークエラーを処理しない | リクエストを try/catch で囲む |
| データ更新に GET を使用する | POST (または PUT/PATCH/DELETE) を使用する |
結論
HTTP POST メソッドは Web 開発の基盤です。REST API の構築、フォームの送信、ファイルのアップロードなど、POST リクエストの構造、コンテンツタイプ、ステータスコード、エラーハンドリングを理解することで、より優れた開発者になることができます。
画像生成、動画作成、テキスト読み上げなどの AI メディア生成 API を統合するアプリケーションを構築しているなら、Hypereal AI は標準的な POST リクエストを使用する直感的な REST API を提供しています。シンプルな API 呼び出しで AI 画像、動画、話すアバターを生成でき、料金は使用した分だけ支払う仕組みです。
