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ヘッダーに基づいて両方のフォーマットを提供します。

試してみる — HTTP Method Reference

フルツールを開く