更新实体的所有属性时的 REST - PUT 或 PATCH

REST - PUT or PATCH when updating all properties of an entity

在 REST API 中,当我想更新实体的所有属性时,就良好实践而言,使用什么更好? PUT 还是 PATCH?如果使用 PATCH 更好,为什么需要 PUT?两者有什么区别?

如果所有字段都被更新,那么这两个操作都是幂等的,对吧?那么,有什么区别呢?

PUT 是幂等的,PATCH 不是。 PUTidempotent 这一事实意味着 通用 组件可以重复一个请求,只要产生响应所必需的次数即可。

PATCH,就像POST一样,不承诺幂等语义;因此通用组件在它们可以自行执行的操作方面受到更严格的限制。

If all fields are updated, in that case both operations are idempotent, right?

general-purpose 组件将不知道是否所有字段都已更新。高级启发式是这样的:通用组件理解 HTTP headers 的语义,但不一定理解消息体的语义。

And, In this case, why is the PATCH of a complete resource not idempotent?

PATCH 的实现确实可以是幂等的。但这不一定是——PATCH 请求的语义不会 承诺 幂等处理,因此 general-purpose 组件不能假设。

一个可能有用的类比:我们更喜欢使用 GET 进行查询,因为 GET 是 safe。然而,有时其他事情(比如事实上的 URI 长度限制)会妨碍我们,我们不得不使用 POST。我们完全没有理由不能生成有效只读的 POST 处理程序。

但是我们没有任何机制可以让我们告诉 general-purpose 客户端 POST 的这种特殊用途恰好是安全的。

GET 被定义为安全的,因此世界上的每个资源都应该安全地处理它。 POST 不是 定义为安全的;世界上只有一些资源可以安全地处理 POST。因此 general-purpose 组件不能 假设 任何特定资源都可以安全地处理 POST 请求。

同样适用于幂等语义,PUT vs POST/PATCH。