什么是HTTP方法的幂等性?

时间:2017-07-10 15:38:31

标签: http

我已阅读过HTTP文档,但我无法理解什么是 idempotency 。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:33)

Idempotency 是HTTP方法的一个属性。可以多次执行具有幂等HTTP方法的请求,并生成相同的结果

结果理解为服务器上状态的资源(并记住状态代码与幂等性的观点无关)。

RFC 7231

让我们看一下RFC 7231,该文档定义了语义和HTTP / 1.1协议的内容。请参阅下面的引文(突出显示是我的)。

HTTP方法可以安全

  

4.2.1. Safe Methods

     

如果请求方法的定义语义基本上是只读的,则被视为“安全”;即,作为对目标资源应用安全方法的结果,客户端不请求并且不期望源服务器上的任何状态改变。 [...]

     

在本规范定义的请求方法中,GETHEADOPTIONSTRACE方法被定义为安全的。 [...]

和/或幂等

  

4.2.2. Idempotent Methods

     

如果使用该方法对服务器的多个相同请求的预期效果与单个此类请求的效果相同,则请求方法被视为“幂等”。在本规范定义的请求方法中,PUTDELETE和安全请求方法是幂等的。 [...]

总结一下,HTTP方法被归类为following

+---------+------+------------+
| Method  | Safe | Idempotent |
+---------+------+------------+
| CONNECT | no   | no         |
| DELETE  | no   | yes        |
| GET     | yes  | yes        |
| HEAD    | yes  | yes        |
| OPTIONS | yes  | yes        |
| POST    | no   | no         |
| PUT     | no   | yes        |
| TRACE   | yes  | yes        |
+---------+------+------------+  

RFC 5789

RFC 5789定义PATCH方法,既不安全也不幂等。但是,为了防止发生冲突,可以发出PATCH请求,使其成为幂等的,如下所述:

  

PATCH请求可以以幂等方式发布,这也有助于防止在相似时间范围内同一资源上的两个PATCH请求之间发生冲突的不良结果。来自多个PATCH请求的冲突可能比PUT冲突更危险,因为某些补丁格式需要从已知的基点操作,否则它们将破坏资源。使用这种补丁应用程序的客户端应该使用条件请求,如果自客户端上次访问资源后资源已更新,请求将失败。例如,客户端可以在ETag请求的If-Match标头中使用强大的PATCH

答案 1 :(得分:3)

据我了解,幂等性与结果(=服务器响应)无关,而是与一次或多次调用后的服务器状态无关。

假设您要通过调用来删除服务器上的资源

DELETE /resource/123

调用可能以HTTP响应200 OK返回,并且删除的资源首先作为有效负载返回。在第二个呼叫中,“ Response”将为204 NO_CONTENT,因为该资源已被第一个呼叫删除。

在每个请求之后,服务器状态相同,因此满足幂等性。 HTTP / 1.1对响应没有任何说明

  

如果请求方法具有预期效果,则认为该方法是“幂等的”      使用该方法的多个相同请求的服务器是      与单个此类请求的效果相同

答案 2 :(得分:0)

幂等HTTP方法是可以多次调用而没有不同结果的HTTP方法。该方法仅被调用一次还是十次调用都没有关系。结果应该是相同的。从本质上讲,这意味着成功执行请求的结果与执行请求的次数无关。例如,在算术运算中,将数字加零就是幂等运算。

POST不是幂等的。 GET,PUT,DELETE,HEAD,OPTIONS和TRACE是幂等的。

1> POST->每次调用此方法都会产生不同的结果 为什么->考虑一个场景,在此场景中您将创建新资源        每次调用此方法都会导致创建新的资源,每次都给您不同的结果,因此POST(用简单的词“ Insert”)不是幂等方法。

2>其他会给您相同的结果

答案 3 :(得分:-1)

TLDR

  

Idempotenc:获取,输入:为什么?

  • 获取如果递归地发射精确 /resource/123,它将给出相同的结果

  • PUT 如果递归地发射精确 /user/123,它将给出相同的结果

  

非幂等:删除,发布:为什么?

  • 删除如果递归地发射精确 /user/123,它将第二次给出不同结果(404或NOT_FOUND)< / p>

  • POST 如果递归地触发精确 /user/(id is assigned by server),则每次都会给出不同的结果

    < / li>

混乱删除是http文档的IDempotenc,但其行为是非幂等

结论

请求是身份

如果请求给出相同的结果

对于递归完全相同的网址

其他非身份证明

答案 4 :(得分:-6)

Idenpotent方法(GET,OPTIONS)不会在服务器上更改任何内容(除了可能添加日志条目之外)。非幂等(PUT,POST,DELETE)方法会更改用于填充网页内容或在其他地方进行更改的数据(例如移动起重机,转移资金,发送电子邮件)。