首页 > 解决方案 > PUT 和 POST 有什么区别,为什么 PUT 被认为是幂等的?

问题描述

到处都说[在阅读了许多帖子之后] PUT 是幂等的,这意味着具有相同输入的多个请求将产生与第一个请求相同的结果。

但是,如果我们使用 POST 方法将相同的请求与相同的输入一起发送,那么它的行为将再次与 PUT 相同。

那么,PUT和POST之间的幂等性有什么区别。

标签: httppostput

解决方案


这个想法是POST和PUT之间应该有区别,而不是有区别。澄清一下,理想情况下,POST 请求应该创建一个新资源,而 PUT 请求应该用于更新现有资源。因此,发送两个 POST 请求的客户端将创建两个资源,而两个 PUT 请求不会(或者说不应该)导致任何不希望的更改。

更详细地说,幂等性意味着在隔离环境中,来自同一客户端的多个请求对资源的状态没有任何影响。如果来自另一个客户端的请求改变了资源的状态,那么它不会破坏幂等性原则。虽然,如果您真的想确保 put 请求不会最终覆盖来自不同客户端的另一个同时请求的更改,您应该始终使用 etags。详细地说,put request 应该始终提供最后一个资源状态的 etag(它来自 get request),并且只有当 etag 是最新的时才应该更新资源,否则应该引发 412(Precondition Failed)状态代码。在 412 的情况下,假设客户端再次获取资源,然后尝试更新。根据 REST,这对于防止竞争条件至关重要。

根据 W3C(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html),

“方法还可以具有“幂等性”的属性,因为(除了错误或过期问题)N > 0 个相同请求的副作用与单个请求相同。


推荐阅读