我很难理解为什么 PATCH 在 PUT 所在的地方不安全。幂等部分 - 如果我更新资源的一个字段,该字段在更新后不会返回相同的值吗?
最佳答案
这不是安全,因为通常您不能在不更改资源的情况下安全地执行 PATCH 请求(这就是它的用途)。
那么为什么 PATCH 与 PUT 相比不是幂等?这是因为应用更改的方式很重要。如果您想更改资源的 name
属性,您可以发送类似 {"name": "foo"}
的内容作为有效负载,这确实是幂等,因为多次执行此请求都会产生相同的结果:资源 name
属性现在是“foo”。
但是 PATCH 在如何更改资源方面更为通用(查看 this 关于如何应用 JSON 补丁的定义)。例如,它也可能意味着移动资源,看起来像这样: { "op": "move", "from": "/a/b/c", "path": "/a/b/d"}
。此操作显然不是幂等的,因为第二次调用会导致错误。
因此,虽然大多数 PATCH 操作可能是幂等的,但也有一些不是。
对其他答案的评论:幂等性是通过连续多次重复操作来定义的。说某事不是幂等的,因为如果在两者之间或并行执行某些其他操作,效果会有所不同,这不是一个有效的论点(如果是这种情况,一般来说没有任何操作是幂等的)。从数学上讲,幂等变换是一种产生相同结果的变换,无论您应用它的频率如何(比如将某物旋转 360 度)。当然,如果您在两者之间应用任何其他操作,则两次 360 度旋转可能会产生不同的结果。
关于rest - 为什么 PATCH 既不安全也不幂等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41390997/