4

我读过很多地方说 HTTP Patch 是非幂等的。有人能解释一下为什么它是非幂等的吗?因为根据定义 - 幂等方法可能会也可能不会更改资源状态,但重复请求在第一次请求之后应该没有进一步的副作用。重复的 PATCH 请求如何改变资源状态?

4

4 回答 4

6

对此有些困惑。PATCH 方法不需要是幂等的,这就是重点。客户端不能假设他们的 PATCH 请求将是幂等的,因为他们可以使用 PUT 和 GET。

一个特定的实现是否是幂等的通常取决于所使用的修补算法(如果有的话)。例如,不使用验证当前值的差异格式的糟糕实现将不是幂等的。

于 2015-03-21T22:17:52.227 回答
1

是的,有很多讨论和混淆 PUT 和 PATCH 的区别。明确的是:

  • 请求必须包含给定资源的完整表示
  • 是幂等的(客户端可以100%确定)

修补

  • 请求仅包含子集(仅包含我们要更新的属性)
  • 不需要是幂等的(很多时候是幂等的,但这不是规则,所以客户端不能100%确定)

从这些规则中,我们可以推断出我们需要在后端实现的一些规则,例如:

一个)

  • 获取:用户/1;响应正文 { username: 'john', email: 'old@email.com'}
  • PUT:用户/1;请求正文 { username: 'john'}

从 API 发送验证错误(丢失email)或电子邮件将被删除。

我真的希望 API 应该返回验证错误。所以要删除一些值,客户端应该调用(email: null在请求中明确提到):

  • PUT:用户/1;请求正文 { username: 'john', email: null}

b)

  • 补丁:用户/1;请求正文 { username: 'john'}

服务器上没有变化。要删除值,客户端应发送:

  • 补丁:用户/1;请求正文 { email: null}

上面的两个例子都是幂等的。

在另一个讨论中,如果补丁正在对后端的集合执行类似“添加”的操作,则 PATCH 是非幂等的:在 REST API 现实生活场景中使用 PUT 与 PATCH 方法

于 2021-03-16T20:49:52.330 回答
1

我有一个 PATCH 不是幂等的场景:

让我们假设两个不同的客户端正在发送 HTTP 请求。
客户 X
客户 Y

客户端 X
(1) PATCH {"age":"10"}
response1-> {"age":"10", "sex":"f","name":"a"}

客户端 Y
(2) PATCH {"name":"b"}
response2-> {"age":"10", "sex":"f","name":"b"}

客户端 X
(3) PATCH {"age":"10"}
response3-> {"age":"10", "sex":"f", "name" : "b" }

您可以看到,即使请求 (1) 和 (3) 相同,响应也不同。第三个响应中的“名称”“b”

如果这是一个有效的场景,它可以证明 PATCH 方法可以响应不同的响应,即使请求是相同的。PUT 方法永远不会发生这种情况,它应该发送带有所有字段 {age,sex,name} 的整个对象。

于 2018-02-06T08:07:01.090 回答
0

PATCH 不一定是幂等的,尽管它可以。将此与 PUT 进行对比;这总是幂等的。“幂等”这个词意味着任何数量的重复的、相同的请求都会使资源处于相同的状态。例如,如果自动递增计数器字段是资源的一个组成部分,那么 PUT 自然会覆盖它(因为它会覆盖所有内容),但 PATCH 不一定如此。

于 2021-12-26T10:43:43.640 回答