为什么 HTTP PATCH 请求方法不是幂等的
Why HTTP PATCH request method is not idempotent
在 HTTP Spec 中提到 PATCH
是 not
幂等的。
幂等的基本定义是:
An idempotent HTTP method is a HTTP method that can be called many
times without different outcomes
所以如果我们进行 HTTP 调用
PATCH /users/1
{
"username": "dummyUser"
}
无论我们调用 HTTP 端点多少次,它总是意味着将用户 1
的 username
更新为 dummyUser
。
对于更新任何资源的 1 个或多个属性的任何 PATCH
请求,这几乎是相同的。
那为什么HTTP Spec规定PATCH
是not
幂等的呢?
首先,重要的是要澄清 Idempotent: No
并不意味着它永远不会幂等,这意味着它 不一定 幂等,即它不是必需的成为.
因此,在您的示例中,它看起来确实是幂等的,因为在多次重复调用同一 PATCH
请求后资源的状态是相同的。
但考虑一个假设的 PATCH
请求,例如:
PATCH /users/1
successful_logins++
此请求每次调用时都会将用户的 successful_logins
属性递增 1。如您所见,它不是幂等的,因为连续的请求会导致对资源的额外修改。
这与 PUT
方法相反,后者必须包含所有资源属性的绝对值。
在 HTTP Spec 中提到 PATCH
是 not
幂等的。
幂等的基本定义是:
An idempotent HTTP method is a HTTP method that can be called many times without different outcomes
所以如果我们进行 HTTP 调用
PATCH /users/1
{
"username": "dummyUser"
}
无论我们调用 HTTP 端点多少次,它总是意味着将用户 1
的 username
更新为 dummyUser
。
对于更新任何资源的 1 个或多个属性的任何 PATCH
请求,这几乎是相同的。
那为什么HTTP Spec规定PATCH
是not
幂等的呢?
首先,重要的是要澄清 Idempotent: No
并不意味着它永远不会幂等,这意味着它 不一定 幂等,即它不是必需的成为.
因此,在您的示例中,它看起来确实是幂等的,因为在多次重复调用同一 PATCH
请求后资源的状态是相同的。
但考虑一个假设的 PATCH
请求,例如:
PATCH /users/1
successful_logins++
此请求每次调用时都会将用户的 successful_logins
属性递增 1。如您所见,它不是幂等的,因为连续的请求会导致对资源的额外修改。
这与 PUT
方法相反,后者必须包含所有资源属性的绝对值。