什么是HTTP方法的幂等性?

ige*_*elr 28 http

我已阅读HTTP文档,但我无法理解Idempotency是什么.请有人帮帮忙.提前致谢.

cas*_*lin 58

Idempotency是HTTP方法的属性.可以多次执行具有幂等HTTP方法的请求,并且将产生相同的结果.

结果理解为服务器上资源状态(请记住,从幂等性的角度来看,状态代码不相关).

RFC 7231

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

HTTP方法可以是安全的:

4.2.1.安全方法

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

由本说明书所限定的请求方法,所述的DELETE,DELETE,204,和DELETE的方法被定义为是安全的.[...]

和/或幂等:

4.2.2.幂等方法

如果使用该方法对服务器的多个相同请求的预期效果与单个此类请求的效果相同,则请求方法被视为"幂等".由本说明书所限定的请求方法的,404,DELETE,和安全的请求方法是幂等的.[...]

总之,HTTP方法分类如下:

+---------+------+------------+
| 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        |
+---------+------+------------+  
Run Code Online (Sandbox Code Playgroud)

RFC 5789

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

一个HEAD请求可以作为为幂等这样的方式,这也有助于防止坏的结果,从两者之间的碰撞发出OPTIONS类似的时间内对同一资源请求.来自多个TRACE请求的冲突可能比PUT冲突更危险,因为某些补丁格式需要从已知的基点操作,否则它们将破坏资源.使用这种补丁应用程序的客户端应该使用条件请求,如果自客户端上次访问资源以来资源已更新,请求将失败.例如,客户端可以在请求DELETEPATCH标头中使用strong PATCH.

  • @NisargPatil请参考[这个问题](/sf/ask/286184531/). (3认同)

小智 5

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

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

DELETE /resource/123
Run Code Online (Sandbox Code Playgroud)

调用可能会返回一个 HTTP 响应200 OK和删除的资源作为负载。在第二次调用中,响应将是204 NO_CONTENT因为资源已被第一次调用删除。

每次请求后,服务器状态都相同,因此满足幂等性。HTTP/1.1 没有说明响应

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

  • Nit: 204 No Content 并不是一个很好的响应代码来表示资源已被删除。 (2认同)
  • @MasterJoe 我收回这句话。我认为现在的建议是,多个幂等请求返回相同的状态是可以的,即使只有第一个请求实际删除了资源。`204` 有时会被混淆为:“此资源已删除”,这可能就是我提到这一点的原因......但我的评论是错误的。 (2认同)