コンテンツにスキップ

HTTP メソッドは慣習ではなく「契約」である

ほとんどの開発者は HTTP メソッドを単なる慣習だと思っている。

違う。これは契約だ。

メソッド別の特性一覧

メソッド 用途 安全 冪等 キャッシュ ボディ
GET リソースの取得(読み取り専用) ✓ ✓ ✓ –
POST リソースの新規作成 ✗ ✗ – ✓
PUT リソース全体の置き換え ✗ ✓ – ✓
PATCH リソースの部分更新 ✗ ✗ – ✓
DELETE リソースの削除 ✗ ✓ – –

重要な概念

概念 意味 実際の影響
安全(Safe) サーバー側の状態を変更しない GET をキャッシュ・プリフェッチしても副作用なし
冪等(Idempotent) 同じリクエストを何回送っても結果が同じ リトライ時に二重処理が起きない

契約違反の典型例

  • GET でデータを変更する: キャッシュに乗り変更が実行されなくなる危険

  • POST をリトライする: 非冪等なため二重レコードが生まれる可能性(冪等キーで対処)

  • DELETE を複数回叩く: 冪等なので 2 回目は 404 でよい(エラーにすべきでない)

  • PUT で部分更新する: 省略フィールドが消える。部分更新には PATCH を使う

要点

  • HTTP メソッドはクライアント・サーバー・インフラ(CDN・プロキシ)間の契約

  • 冪等性の違反はリトライ設計を壊し、重複処理・データ不整合を招く

  • POST を「なんでも処理するメソッド」として使うのは契約違反