HTTPメソッドによるコンテンツネゴシエーション
HTTPのAcceptおよびContent-Typeヘッダーが異なるメソッドでどのように機能し、レスポンスとリクエストのフォーマットをネゴシエートするかを学びます。
REST Patterns
詳細な説明
コンテンツネゴシエーションとは?
コンテンツネゴシエーションにより、クライアントとサーバーは交換するデータのフォーマットについて合意できます。クライアントはリクエストヘッダーで希望するフォーマットを指定し、サーバーは最適な一致で応答します。
主要なヘッダー
| ヘッダー | 方向 | 目的 |
|---|---|---|
Accept |
リクエスト | クライアントが処理できるフォーマット |
Content-Type |
両方 | ボディのフォーマット |
Accept-Encoding |
リクエスト | 圧縮フォーマット(gzip, br) |
Accept-Language |
リクエスト | 希望する言語 |
Acceptヘッダー付きGET
GET /api/users/42 HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{ "id": 42, "name": "Alice" }
同じエンドポイント、異なるフォーマット:
GET /api/users/42 HTTP/1.1
Accept: application/xml
HTTP/1.1 200 OK
Content-Type: application/xml
<user><id>42</id><name>Alice</name></user>
Content-Type付きPOST/PUT
データ送信時、Content-Typeはサーバーにボディの解析方法を伝えます:
POST /api/users HTTP/1.1
Content-Type: application/json
{ "name": "Bob" }
POST /api/users HTTP/1.1
Content-Type: application/x-www-form-urlencoded
name=Bob&email=bob%40example.com
POST /api/users HTTP/1.1
Content-Type: multipart/form-data; boundary=----FormBoundary
------FormBoundary
Content-Disposition: form-data; name="name"
Bob
------FormBoundary
Content-Disposition: form-data; name="avatar"; filename="photo.jpg"
Content-Type: image/jpeg
[バイナリデータ]
------FormBoundary--
406 Not Acceptable
サーバーがクライアントの受け入れ可能なフォーマットのいずれでもレスポンスを生成できない場合:
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{
"error": "サポートされるフォーマット: application/json, application/xml"
}
415 Unsupported Media Type
サーバーがリクエストボディのフォーマットを理解できない場合:
HTTP/1.1 415 Unsupported Media Type
Content-Type: application/json
{
"error": "期待されるContent-Type: application/json"
}
Quality値
クライアントは優先度の重みを指定できます:
Accept: application/json;q=1.0, application/xml;q=0.5, text/plain;q=0.1
サーバーはサポートする最高品質のフォーマットを選択します。
ユースケース
APIがデフォルトでJSONでデータを提供しますが、レガシークライアント向けにXMLもサポートしています。モバイルアプリはAccept: application/jsonを送信し、古いエンタープライズシステムはAccept: application/xmlを送信します。同じエンドポイントがAcceptヘッダーに基づいて両方のフォーマットを提供します。