aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/glossary/幂等/index.html
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   -&gt; Adds a 2nd row
POST /add_row HTTP/1.1   -&gt; Adds a 3rd row
</pre>

<p><code>DELETE /idX/delete HTTP/1.1</code> 幂等的,即便是不同请求之间接收到的状态码不一样:</p>

<pre class="notranslate">DELETE /idX/delete HTTP/1.1   -&gt; Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -&gt; Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -&gt; 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>