为什么 HTTP PATCH 请求方法不是幂等的

Why HTTP PATCH request method is not idempotent

HTTP Spec 中提到 PATCHnot 幂等的。

幂等的基本定义是:

An idempotent HTTP method is a HTTP method that can be called many times without different outcomes

所以如果我们进行 HTTP 调用

PATCH /users/1
{
    "username": "dummyUser"
}

无论我们调用 HTTP 端点多少次,它总是意味着将用户 1username 更新为 dummyUser

对于更新任何资源的 1 个或多个属性的任何 PATCH 请求,这几乎是相同的。

那为什么HTTP Spec规定PATCHnot幂等的呢?

首先,重要的是要澄清 Idempotent: No 并不意味着它永远不会幂等,这意味着它 不一定 幂等,即它不是必需的成为.

因此,在您的示例中,它看起来确实是幂等的,因为在多次重复调用同一 PATCH 请求后资源的状态是相同的。

但考虑一个假设的 PATCH 请求,例如:

PATCH /users/1

successful_logins++

此请求每次调用时都会将用户的 successful_logins 属性递增 1。如您所见,它不是幂等的,因为连续的请求会导致对资源的额外修改。

这与 PUT 方法相反,后者必须包含所有资源属性的绝对值。