Idempotent (べき等)
ある HTTP メソッドがべき等であるとは、単一のリクエストを送信した際のサーバーへの意図された効果が、同一のリクエストを複数回送信した場合の効果と同一であることです。
HTTP 仕様書では、複数の HTTP メソッドとその意味論を定義しており、これにはそれらがべき等であるか否かも含まれます。安全なメソッドはすべてべき等であり、PUT、DELETE も同様です。 POST および PATCH メソッドは、べき等であることが保証されません。
クライアントは、例えばリクエストがサーバーに到達したかどうかに疑念がある場合など、べき等なメソッドを使用するリクエストは安全に再試行できます。複数の同一リクエストがサーバーに到達した場合でも、そのメソッドがべき等であれば、何の問題も生じません。
HTTP 仕様書では、クライアントがサーバーに及ぼす「意図された」効果に関してのみ、べき等性を定義しています。例えば、POST リクエストはサーバーにデータを送信することを意図し、DELETE リクエストはサーバー上のリソースを削除することを意図します。実際には、公開するルートがこれらの意味論に準拠していることを確認するのはサーバーの責任となります。
メモ: サーバーは HTTP 仕様書で定められた意味論に従うことが強く推奨されるものの、仕様書はそれを義務付けてはいません。実環境のサーバーが、べき等性のある HTTP メソッドの下でべき等性のないエンドポイントを公開してはいけないという決まりは何もありません。ただし、クライアントは意外に思うかもしれません。
また、以下の点に留意してください。
例
GET /pageX HTTP/1.1 は安全な(読み取り専用)メソッドであるため、べき等です。呼び出しが連続して行われた場合、その間にサーバー上のデータが更新されると、クライアントに異なるデータが返される可能性があります。
POST /add_row HTTP/1.1 はべき等ではありません。複数回呼び出すと、その回数だけ列に追加されていきます。
POST /add_row HTTP/1.1
POST /add_row HTTP/1.1 -> 2 行目に追加
POST /add_row HTTP/1.1 -> 3 行目に追加
DELETE /idX/delete HTTP/1.1 はべき等ですが、状態コードは数回のリクエストの間に変化することがあります。
DELETE /idX/delete HTTP/1.1 -> idX が存在する場合は 200 を返却
DELETE /idX/delete HTTP/1.1 -> ちょうど削除されたので 404 を返却
DELETE /idX/delete HTTP/1.1 -> 404 を返却