blob: cc8b22c143d7a3154ec5d9290f4578d7802b7aaf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
---
title: 幂等
slug: Glossary/幂等
tags:
- Glossary
- WebMechanics
translation_of: Glossary/Idempotent
---
<p>一个HTTP方法是<strong>幂等</strong>的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下, {{HTTPMethod("GET")}} , {{HTTPMethod("HEAD")}} , {{HTTPMethod("PUT")}} 和 {{HTTPMethod("DELETE")}} 等方法都是<strong>幂等</strong>的,而 {{HTTPMethod("POST")}} 方法不是。所有的 {{glossary("safe")}} 方法也都是幂等的。</p>
<p>幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同。例如,第一次调用 {{HTTPMethod("DELETE")}} 方法有可能返回 {{HTTPStatus("200")}} ,但是后续的请求可能会返回 {{HTTPStatus("404")}} 。 {{HTTPMethod("DELETE")}} 的言外之意是,开发者不应该使用 <code>DELETE</code> 法实现具有删除最后条目功能的 RESTful API。</p>
<p>需要注意的是,服务器不一定会确保请求方法的幂等性,有些应用可能会错误地打破幂等性约束。</p>
<p><code>GET /pageX HTTP/1.1</code> 幂等的。连续调用多次,客户端接收到的结果都是一样的:</p>
<pre class="notranslate">GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
</pre>
<p><code>POST /add_row HTTP/1.1</code> 是幂等的。如果调用多次,就会增加多行记录:</p>
<pre class="notranslate">POST /add_row HTTP/1.1
POST /add_row HTTP/1.1 -> Adds a 2nd row
POST /add_row HTTP/1.1 -> Adds a 3rd row
</pre>
<p><code>DELETE /idX/delete HTTP/1.1</code> 幂等的,即便是不同请求之间接收到的状态码不一样:</p>
<pre class="notranslate">DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1 -> Returns 404</pre>
<h2 id="了解更多">了解更多</h2>
<h3 id="基本知识">基本知识</h3>
<ul>
<li>在HTTP协议中<a href="https://tools.ietf.org/html/rfc7231#section-4.2.2">幂等</a>的定义。</li>
</ul>
<h3 id="技术知识">技术知识</h3>
<ul>
<li>常见的幂等方法: {{HTTPMethod("GET")}} , {{HTTPMethod("HEAD")}} , {{HTTPMethod("PUT")}} , {{HTTPMethod("DELETE")}} , {{HTTPMethod("OPTIONS")}} </li>
<li>常见的非幂等方法: {{HTTPMethod("POST")}} </li>
</ul>
|