为什么patch不幂等

发布时间 2023-03-26 01:14:23作者: Python喵

我无法理解为什么PATCH在PUT不安全的地方.也就是幂等部分 - 如果我更新资源的一个字段,那么该字段在更新后是否会返回相同的值?

 

这是不安全的,因为通常你不能在不改变资源的情况下安全地执行PATCH请求(这就是它的用途).

那么为什么与PUT相比,PATCH不是幂等的?这是因为您应用更改的方式很重要.如果您想要更改name资源的属性,您可能会发送类似{"name": "foo"}有效负载的内容,这确实是幂等的,因为执行此请求任意次都会产生相同的结果:资源name属性现在是"foo".

但PATCH是如何更改的资源更普遍(查看这个关于如何应用一个JSON补丁定义).例如,它也可能意味着移动资源,看起来像这样:{ "op": "move", "from": "/a/b/c", "path": "/a/b/d" }.此操作显然不是幂等的,因为第二次调用会导致错误.

因此,虽然大多数PATCH操作可能是幂等的,但有一些不是.

关于其他答案的一点评论:通过连续多次重复操作来定义幂等性.说某些东西不是幂等的,因为如果在中间或并行执行某些其他操作,效果是不同的,那么这不是一个有效的参数(如果是这种情况,通常操作不会是幂等的).在数学上,幂等变换是产生相同结果的变换,无论你多么频繁地应用它(比如旋转360度).当然,如果您在其间应用任何其他操作,则两次360度旋转可能会产生不同的结果.

 

  • 我认为您与批评的其他答案处于同一陷阱:用JSON补丁发送第二个PATCH请求可能不会给您相同的响应,但是* resource *的状态将与第一个之后的状态相同PATCH请求,因此在这种情况下,您的PATCH请求*是幂等的。*不是*幂等的PATCH请求例如是将项目附加到数组:使用JSON补丁格式,“ {” op”:“ add”,“ path”:“ /-”,“ value”:“ foo” }`第一次将`[]`转换为`[“ foo”]`,然后第二次转换为`[“ foo”,“ foo”]`,然后转换为`[“ foo”,“ foo”,“ foo “]`第三次,等等。 (7认同)