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(変更なし)を返し、最小限の帯域幅を消費します。記事が実際に更新された場合のみ、完全なレスポンスボディが転送されます。

試してみる — HTTP Method Reference

フルツールを開く