ETagとIf-Modified-Sinceによる条件付きGETリクエスト
ETag、If-None-Match、If-Modified-Sinceなどの条件付きリクエストヘッダーを使用して帯域幅とキャッシュを最適化する方法を学びます。
Best Practices
詳細な説明
条件付きリクエストとは?
条件付きリクエストにより、クライアントはサーバーに「前回取得してからこのリソースは変更されましたか?」と尋ねることができます。変更されていない場合、サーバーはボディなしで304 Not Modifiedを返し、帯域幅を節約します。
ETagベースの条件付きリクエスト
ステップ1: クライアントがリソースを取得し、ETagを受け取る:
GET /api/users/42 HTTP/1.1
Host: api.example.com
HTTP/1.1 200 OK
ETag: "v3-abc123"
Content-Type: application/json
{ "id": 42, "name": "Alice", "version": 3 }
ステップ2: クライアントがIf-None-Match付きの条件付きリクエストを送信:
GET /api/users/42 HTTP/1.1
If-None-Match: "v3-abc123"
ステップ3: サーバーがETagの一致を確認:
HTTP/1.1 304 Not Modified
ETag: "v3-abc123"
ボディは転送されません — クライアントはキャッシュされたコピーを使用します。
日付ベースの条件付きリクエスト
GET /api/reports/daily HTTP/1.1
If-Modified-Since: Thu, 15 Jan 2026 10:00:00 GMT
リソースが指定日時以降に変更されていない場合:
HTTP/1.1 304 Not Modified
Last-Modified: Thu, 15 Jan 2026 10:00:00 GMT
競合防止のための条件付きPUT
ETagは安全でないメソッドでも使用され、更新の喪失を防ぎます:
PUT /api/users/42 HTTP/1.1
If-Match: "v3-abc123"
Content-Type: application/json
{ "name": "Alice Updated", "version": 4 }
別のクライアントがリソースを変更した場合(ETagが一致しなくなった場合):
HTTP/1.1 412 Precondition Failed
これは楽観的並行制御のHTTPによる実装方法です。
条件付きヘッダーのまとめ
| ヘッダー | 使用対象 | 目的 |
|---|---|---|
If-None-Match |
GET, HEAD | ETagが一致する場合ダウンロードをスキップ |
If-Modified-Since |
GET, HEAD | 指定日時以降に変更がない場合スキップ |
If-Match |
PUT, PATCH, DELETE | リソースが変更された場合更新を防止 |
If-Unmodified-Since |
PUT, PATCH, DELETE | 指定日時以降に変更された場合更新を防止 |
ユースケース
ニュースリーダーアプリが5分ごとにIf-None-Match付きの条件付きGETで記事の更新を確認します。ほとんどのリクエストは304(変更なし)を返し、最小限の帯域幅を消費します。記事が実際に更新された場合のみ、完全なレスポンスボディが転送されます。