原文链接:restfulapi.net/idempotent-…
作者:Lokesh Gupta
1.什么是幂等API?
在 REST API 的上下文中,当发出多个相同的请求与发出单个请求具有相同的效果时,该 REST API 被称为幂等。
当我们设计 REST API 时,我们必须意识到 API 使用者可能会犯错误。消费者编写客户端代码时可能会向 API 发送重复请求。
这些重复请求可能是无意或有意的(例如由于超时或网络问题)。我们必须让我们的 API具有容错能力,这样重复的请求才不会导致系统稳定性问题。
幂等 HTTP 方法意为可以多次调用而不会产生不同结果。该方法只被调用一次还是十次都无关紧要。结果应该总是一样的。
幂等性本质上意味着执行请求成功对服务器资源的影响与执行次数无关。
例如,在算术中,给一个数字加零是一种幂等运算。
2. HTTP 方法(Methods)的幂等性
在设计 API 时遵循 REST 原则,我们将自动为 GET、PUT、DELETE、HEAD、OPTIONS 和 TRACE 方法提供幂等的 REST API。 只有POST
API 不会是幂等的。
POST
不是幂等的。GET
,PUT
,DELETE
,HEAD
,OPTIONS
和TRACE
是幂等的。
让我们分析一下上述 HTTP 方法为什么最终是幂等的,以及为什么 POST 不是幂等的。
2.1. HTTP POST
通常(但不绝对)POST
API 用于在服务器上创建新资源。
因此,当我们调用同一个 POST 请求 N 次时,我们会在服务器上拥有 N 个新资源。所以,POST 不是幂等的。
2.2. HTTP GET、HEAD、OPTIONS 和 TRACE
GET
、HEAD
、OPTIONS
和TRACE
方法不会更改服务器上的资源状态。它们纯粹用于在特定时间点检索资源表示情况或元数据。
因此,调用多个请求不会对服务器有任何写操作,所以GET、HEAD、OPTIONS、TRACE是幂等的。
2.3. HTTP PUT
通常(但不绝对)PUT
API 用于更新资源状态。如果你调用一个PUT
API N 次,第一个请求将更新资源;其他 N-1 个请求只会一次又一次地覆盖相同的资源状态——实际上不会改变任何东西。
因此,PUT 是幂等的。
2.4 HTTP 删除
2.4.1. 删除具有资源标识符(resource identifier)的文件
当你调用 N 个类似DELETE
的请求时,第一个请求将删除资源,响应将是200 (OK)
或204 (No Content)
。
其他 N-1 请求将返回 404(未找到)。
显然,响应与第一个请求不同,但服务器端的任何资源都没有状态变化,因为原始资源已被删除。
因此,DELETE 是幂等的。
2.4.2. 删除不含资源标识符(resource identifier)的文件
请记住,如果某些系统具有这样的 DELETE API:
DELETE /item/last
在上述情况下,调用操作 N 次将删除 N 个资源——因此DELETE
在这种情况下不是幂等的。在这种情况下,一个好的建议可能是将上述 API 更改为 POST——因为 POST 不是幂等的。
POST /item/last
现在,这更接近 HTTP 规范,也就更符合 REST原则。
参考: