|
1 | 1 | --- |
2 | 2 | title: Idempotent (べき等) |
3 | 3 | slug: Glossary/Idempotent |
| 4 | +l10n: |
| 5 | + sourceCommit: 99d723c4f77d7f537292a07dd7b5e5c13cb610da |
4 | 6 | --- |
5 | 7 |
|
6 | | -{{GlossarySidebar}} |
| 8 | +ある HTTP メソッドが**べき等**であるとは、単一のリクエストを送信した際のサーバーへの意図された効果が、同一のリクエストを複数回送信した場合の効果と同一であることです。 |
7 | 9 |
|
8 | | -ある HTTP メソッドが**べき等**であるとは、サーバーが同じ状況にあるとき、特定のリクエストに対して何回でも続けて同じ効果が起こることをいいます。このことは、べき等なメソッドでは (統計を取る際のことを除いて) 副作用が生じるはずではないと言うこともできます 。 適切に実装された {{HTTPMethod("GET")}}、{{HTTPMethod("HEAD")}}、{{HTTPMethod("PUT")}}、{{HTTPMethod("DELETE")}} の各メソッドは**べき等**ですが、{{HTTPMethod("POST")}} メソッドはそうではありません。{{Glossary("Safe/HTTP", "安全な")}}メソッドはすべてべき等です。 |
| 10 | +HTTP 仕様書では、複数の HTTP メソッドとその意味論を定義しており、これにはそれらがべき等であるか否かも含まれます。{{Glossary("Safe/HTTP", "安全な")}}メソッドはすべてべき等であり、{{HTTPMethod("PUT")}}、{{HTTPMethod("DELETE")}} も同様です。 {{HTTPMethod("POST")}} および {{HTTPMethod("PATCH")}} メソッドは、べき等であることが保証されません。 |
9 | 11 |
|
10 | | -べき等であるためには、サーバーにおける裏側の実際の状態だけが考慮されるので、返される状態コードはリクエストごとに異なる場合があります。 例えば、最初に {{HTTPMethod("DELETE")}} メソッドが呼び出された場合は、おそらく {{HTTPStatus("200")}} を返しますが、それ以降は {{HTTPStatus("404")}} を返すでしょう。RESTful な API の設計において、*最後の入力操作を削除する*機能を `DELETE` メソッドを使って実装すべきでないとされるのも、{{HTTPMethod("DELETE")}} メソッドがべき等であることを示唆しています。 |
| 12 | +クライアントは、例えばリクエストがサーバーに到達したかどうかに疑念がある場合など、べき等なメソッドを使用するリクエストは安全に再試行できます。複数の同一リクエストがサーバーに到達した場合でも、そのメソッドがべき等であれば、何の問題も生じません。 |
11 | 13 |
|
12 | | -なお、メソッドがべき等であっても、サーバーやアプリケーションによってべき等性の破壊が生じることがあります。 |
| 14 | +HTTP 仕様書では、クライアントがサーバーに及ぼす「意図された」効果に関してのみ、べき等性を定義しています。例えば、`POST` リクエストはサーバーにデータを送信することを意図し、`DELETE` リクエストはサーバー上のリソースを削除することを意図します。実際には、公開するルートがこれらの意味論に準拠していることを確認するのはサーバーの責任となります。 |
13 | 15 |
|
14 | | -例えば、 `GET /pageX HTTP/1.1` はべき等です。連続して何度か呼び出しても、クライアントは同じ結果を得ます。 |
| 16 | +> [!NOTE] |
| 17 | +> サーバーは HTTP 仕様書で定められた意味論に従うことが強く推奨されるものの、仕様書はそれを義務付けてはいません。実環境のサーバーが、べき等性のある HTTP メソッドの下でべき等性のないエンドポイントを公開してはいけないという決まりは何もありません。ただし、クライアントは意外に思うかもしれません。 |
15 | 18 |
|
16 | | -``` |
17 | | -GET /pageX HTTP/1.1 |
18 | | -GET /pageX HTTP/1.1 |
19 | | -GET /pageX HTTP/1.1 |
20 | | -GET /pageX HTTP/1.1 |
21 | | -``` |
| 19 | +また、以下の点に留意してください。 |
22 | 20 |
|
23 | | -`POST /add_row HTTP/1.1` はべき等ではありません。 何度か呼び出すと、その回数だけ列に追加されていきます。 |
| 21 | +- べき等メソッドを用いたリクエストは、必ずしもサーバーに「まったく」副作用がないことを意味するわけではありません。クライアントが副作用を意図していないというだけのことです。例えば、サーバーは各リクエストの受信時刻をログに記録している可能性があります。 |
| 22 | +- それぞれのリクエストで返されるレスポンスは異なる場合があります。例えば、{{HTTPMethod("DELETE")}} の最初の呼び出しはおそらく {{HTTPStatus("200")}} を返し、それ以降の呼び出しはおそらく {{HTTPStatus("404")}} を返します。 |
24 | 23 |
|
25 | | -``` |
| 24 | +## 例 |
| 25 | + |
| 26 | +`GET /pageX HTTP/1.1` は安全な(読み取り専用)メソッドであるため、べき等です。呼び出しが連続して行われた場合、その間にサーバー上のデータが更新されると、クライアントに異なるデータが返される可能性があります。 |
| 27 | + |
| 28 | +`POST /add_row HTTP/1.1` はべき等ではありません。複数回呼び出すと、その回数だけ列に追加されていきます。 |
| 29 | + |
| 30 | +```http |
26 | 31 | POST /add_row HTTP/1.1 |
27 | | -POST /add_row HTTP/1.1 -> Adds a 2nd row |
28 | | -POST /add_row HTTP/1.1 -> Adds a 3rd row |
| 32 | +POST /add_row HTTP/1.1 -> 2 行目に追加 |
| 33 | +POST /add_row HTTP/1.1 -> 3 行目に追加 |
29 | 34 | ``` |
30 | 35 |
|
31 | 36 | `DELETE /idX/delete HTTP/1.1` はべき等ですが、状態コードは数回のリクエストの間に変化することがあります。 |
32 | 37 |
|
33 | | -``` |
| 38 | +```http |
34 | 39 | DELETE /idX/delete HTTP/1.1 -> idX が存在する場合は 200 を返却 |
35 | 40 | DELETE /idX/delete HTTP/1.1 -> ちょうど削除されたので 404 を返却 |
36 | 41 | DELETE /idX/delete HTTP/1.1 -> 404 を返却 |
37 | 42 | ``` |
38 | 43 |
|
39 | 44 | ## 関連情報 |
40 | 45 |
|
41 | | -- HTTP 規格における[べき等](https://tools.ietf.org/html/rfc7231#section-4.2.2)の定義 |
| 46 | +- HTTP 仕様書における[べき等](https://httpwg.org/specs/rfc9110.html#idempotent.methods)の定義 |
42 | 47 | - べき等なメソッド: {{HTTPMethod("GET")}}, {{HTTPMethod("HEAD")}}, {{HTTPMethod("PUT")}}, {{HTTPMethod("DELETE")}}, {{HTTPMethod("OPTIONS")}}, {{HTTPMethod("TRACE")}} |
43 | 48 | - べき等でないメソッド: {{HTTPMethod("POST")}},{{HTTPMethod("PATCH")}}, {{HTTPMethod("CONNECT")}} |
0 commit comments