我已经阅读了HTTP文档,但是我无法理解什么是幂等性。有人可以帮忙吗?
我已经阅读了HTTP文档,但是我无法理解什么是幂等性。有人可以帮忙吗?
最后,使用幂等方法的请求如果在客户端能够读取服务器响应之前发生通信故障,则可以自动重复。即使原始请求成功,客户端也知道重复请求将产生相同的预期效果,尽管响应可能会有所不同。
让我们来看看RFC 7231,这个文档定义了HTTP/1.1协议的语义和内容。请参见以下引用(我的部分是高亮显示的)。
HTTP方法可以是安全的:
如果请求方法的定义语义基本上是只读的,则认为它们是“安全”的;也就是说,客户端在将安全方法应用于目标资源时不会请求或期望在源服务器上产生任何状态更改。[...]
安全方法的这个定义并不会阻止实现包含潜在有害的行为,这些行为并非完全只读,或者在调用安全方法时会导致副作用。然而,重要的是客户端没有请求附加行为,因此不能对其负责。[...]
在本规范中定义的请求方法中,
GET
、HEAD
、OPTIONS
和TRACE
方法被定义为安全方法。[...]
并且/或幂等性:
如果使用相同的请求方法多次请求服务器,产生的效果与只请求一次相同,则该请求方法被认为是“幂等的”。在本规范定义的请求方法中,
PUT
、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 |
+---------+------+------------+
RFC 5789 定义了 PATCH
方法,该方法既不安全也不幂等。然而,为了防止冲突,PATCH
请求可以以幂等的方式发出,如下所述:
发出
PATCH
请求时,可以以幂等的方式发出,这也有助于防止在类似时间范围内对同一资源进行两个PATCH
请求之间发生冲突造成不良后果。多个PATCH
请求引起的冲突可能比PUT
冲突更危险,因为某些补丁格式需要从已知基点操作,否则它们将破坏该资源。使用这种类型的补丁应用程序的客户端应使用条件请求,以便如果自上次访问资源以来已更新资源,则请求将失败。例如,客户端可以在PATCH
请求的If-Match
头中使用强ETag
。
DELETE
如何成为幂等方法?如果成功,通常会返回 200 (OK)
或 204 (No Content)
。 - Nisarg Patil我的理解是,幂等性与结果(服务器响应)无关,而与单次或多次调用后的服务器状态有关。
假设您想通过调用来删除服务器上的一个资源
DELETE /resource/123
200 OK
,并在第一次调用中将已删除的资源作为有效载荷返回。在第二次调用中,响应将是204 NO_CONTENT
,因为第一次调用已经删除了该资源。如果具有该方法的多个标识请求的预期效果与单个标识请求的效果相同,则认为请求方法是“幂等”的。
204
状态码会被误解为“该资源已被删除”,这可能就是我提到这个问题的原因……但我的评论是错误的。 - Evert简述
幂等性:GET,PUT:为什么?
GET 如果递归地触发 exact /resource/123
它将会给出相同的结果
PUT 如果递归地触发 exact /user/123
它将会给出相同的结果
非幂等性:DELETE,POST:为什么?
DELETE 如果递归地触发 exact /user/123
它将会第二次给出不同的结果(404或NOT_FOUND)
POST 如果递归地触发 exact /user/(id由服务器分配)
它将会每次给出不同的结果
如果请求返回相同的结果,则对于完全相同的 URL 进行递归触发。
幂等的HTTP方法是指可以多次调用而不会产生不同结果的HTTP方法。无论该方法只被调用一次还是十次以上,结果应该是相同的。这实际上意味着成功执行请求的结果与其执行次数无关。例如,在算术中,将零加到一个数字上是幂等操作。
POST方法不是幂等的。 GET、PUT、DELETE、HEAD、OPTIONS和TRACE是幂等的。
1>POST -->每次调用此方法都会给出不同的结果 为什么-->考虑一个场景,您正在创建新资源 每次调用此方法都会导致创建新资源,从而每次都会给您不同的结果,因此,POST(简单地说是“插入”)是非幂等方法。
2>其他方法将给您相同的结果
幂等方法(GET,OPTIONS)不会改变服务器上的任何内容(除了可能添加日志条目)。非幂等方法(PUT,POST,DELETE)会更改用于填充Web页面中内容或在其他地方产生影响(例如移动起重机,转移资金,发送电子邮件)的数据。