[2] [[HTTP]] において[DFN[[RUBY[冪等][べきとう]@en[idempotent]]]]とは、
同じ[[要求]]を何度繰り返し実行しても結果が同じであることを言います。

* 仕様書

[REFS[
- [10] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.2.2>'''
- [18] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-8.1.1>
]REFS]

* 定義

[12] [[要求メソッド]]は、同じ[[要求]]を複数行っても、一度だけ行っても、
[[鯖]]において同じ効果となることが意図されているなら、
[DFN[[RUBYB[[[冪等]]]@en[idempotent]]]]です。 [SRC[>>10]]

[15] ただしこれは[[利用者]]が何を[[要求]]しているかを表す性質ですから、
実際に[[鯖]]で何が行われるかは別の問題となります。 [SRC[>>10]]

[EG[
[16] 例えば[[鯖]]は[[アクセスログ]]に毎回記録しても構いませんし、
変更履歴を残すなど[[副作用]]があっても構いません。 [SRC[>>10]]
]EG]

* 処理モデル

[17] [[冪等]]な[[メソッド]]については、[[クライアント]]が[[応答]]を読む前に通信エラーがあったとしても、
[[要求]]を自動的に再実行できます。
[SRC[>>10]]

* 冪等なメソッドの一覧

[11] 次の[[メソッド]]は、[[冪等]]です。

[FIG(list short)[
- [4] [CODE(HTTP)@en[[[GET]]]]
- [5] [CODE(HTTP)@en[[[HEAD]]]]
- [6] [CODE(HTTP)@en[[[PUT]]]]
- [7] [CODE(HTTP)@en[[[DELETE]]]]
- [8] [CODE(HTTP)@en[[[TRACE]]]]
- [9] [CODE(HTTP)@en[[[OPTIONS]]]]
- [CODE(HTTP)@en[[[PROPFIND]]]]
- [CODE(HTTP)@en[[[PROPPATCH]]]]
- [CODE(HTTP)@en[[[MKCOL]]]]
- [CODE(HTTP)@en[[[COPY]]]]
- [CODE(HTTP)@en[[[MOVE]]]]
]FIG]

[19] [[要求メソッド]]を [[IANA]] に登録する際に、[[冪等]]か否かも記載することになっています
[SRC[>>18]]。

* 副作用ある操作の冪等性

[21] 
[[Stripe]] の [[Web API]]
は、
独自の
[CODE[Idempotency-Key:]]
ヘッダーを使って、
[CODE[POST]]
操作の[[冪等性]]を[[要求]]の送信舎が制御できるようにしています。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[1] RFC 2068・2616 (HTTP/1.1) 9.1.2 Idempotent Methods
]FIGCAPTION]

> Methods [DEL[may]] [INS[can]] also have the property of "idempotence" in that (aside
from error or expiration issues) the side-effects of N > 0 identical
requests is the same as for a single request. The methods GET, HEAD,
PUT and DELETE share this property. [INS[Also, the methods OPTIONS and TRACE SHOULD NOT have side effects, and so are inherently idempotent.]]

[[メソッド]]は[DFN[[RUBY[冪等] [べきとう]]]]という[[特性]]も持つことがあります。
これは、 ([[誤り]]や[[満期]]の問題は別として)
同じ[[要求]]を [CODE(math)@en[[VAR[N]] > 0]]
回行った時の[[副作用]]が1回の[[要求]]に対する[[副作用]]と同じであることを表します。
[[メソッド]] [CODE(HTTP)@en[[[GET]]]], [CODE(HTTP)@en[[[HEAD]]]],
[CODE(HTTP)@en[[[PUT]]]], [CODE(HTTP)@en[[[DELETE]]]] はこの特性を持ちます。 [INS[また、 [CODE(HTTP)@en[[[OPTIONS]]]] [[メソッド]]と [CODE(HTTP)@en[[[TRACE]]]] [[メソッド]]は[[副作用]]を持つ'''べきではありません'''から、元々[[冪等]]です。]]

[INS[

和訳者注: '''べき'''なのですから、
[[副作用]]を持って[[冪等]]性が成り立たなくても一応[[適合]]するはずで、
[Q[元々[[冪等]]]]というのは言葉が過ぎてはいませんでしょうか。
]INS]

[INS[

> However, it is possible that a sequence of several requests is non-idempotent, even if all of the methods executed in that sequence are
idempotent. (A sequence is idempotent if a single execution of the
entire sequence always yields a result that is not changed by a
reexecution of all, or part, of that sequence.) For example, a
sequence is non-idempotent if its result depends on a value that is
later modified in the same sequence.

しかし、単独ではすべて[[冪等]]な[[メソッド]]の列が[[冪等]]ではないこともあります。
(ある列が[[冪等]]であるとは、
その列を一度実行して得られる結果がその列の一部又は全部を再実行しても変わらないことをいいます。)
例えば、結果が同じ列の後の方で修正される値に依存している場合、
その列は[[冪等]]ではありません。

> A sequence that never has side effects is idempotent, by definition
(provided that no concurrent operations are being executed on the
same set of resources).

[[副作用]]を決して持たない列は、
(同じ[[資源]]の[[集合]]に対して[[並行]]して[[操作]]が行われないならば)
定義より[[冪等]]です。
]INS]
]FIG]

* 関連

[3] [[安全なメソッド]]と似ていますが、[[冪等]]であるからといって[[安全]]とは限りません。

[13] 逆に[[安全なメソッド]]は、すべて[[冪等]]です [SRC[>>10]]。

;; [14] 将来にわたってこの性質が保証されるのかは不明です。

[20] [[冪等なメソッド]]であっても、間で他の操作が行われれば、結果は異なったものとなるかもしれません。