为什么PATCH既不安全也不幂等?

Ton*_*ent 14 rest http restful-architecture http-patch

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

C. *_*Doe 15

这是不安全的,因为通常你不能在不改变资源的情况下安全地执行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认同)

Ski*_*kip 6

PATCH 更改资源属性。更改可能需要属性的具体先前值,这使其成为非幂等的。

From Name=John to Name=Gargantua. 
Run Code Online (Sandbox Code Playgroud)

重复应用后,名称将是 Gargantua 并且补丁将失败,因为它要求名称在更改前为“John”

"from Name=John"


use*_*094 6

我最近开始研究 Patch 是否是幂等的,在阅读了 JSON 补丁格式后,我明白如果使用 Patch 方法应用添加操作,则完全有可能请求是非幂等的,因为它可以将新值添加到如果多次发出相同的请求,则为现有资源。

{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }

  • 为什么主体中有一个添加操作?这不是 RESTful,而是 RPC。“添加”操作是对 /a/b/c 资源的 POST。 (2认同)