更新实体的所有属性时的 REST - PUT 或 PATCH
REST - PUT or PATCH when updating all properties of an entity
在 REST API 中,当我想更新实体的所有属性时,就良好实践而言,使用什么更好? PUT
还是 PATCH
?如果使用 PATCH
更好,为什么需要 PUT
?两者有什么区别?
如果所有字段都被更新,那么这两个操作都是幂等的,对吧?那么,有什么区别呢?
PUT
是幂等的,PATCH
不是。 PUT
是 idempotent 这一事实意味着 通用 组件可以重复一个请求,只要产生响应所必需的次数即可。
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。
在 REST API 中,当我想更新实体的所有属性时,就良好实践而言,使用什么更好? PUT
还是 PATCH
?如果使用 PATCH
更好,为什么需要 PUT
?两者有什么区别?
如果所有字段都被更新,那么这两个操作都是幂等的,对吧?那么,有什么区别呢?
PUT
是幂等的,PATCH
不是。 PUT
是 idempotent 这一事实意味着 通用 组件可以重复一个请求,只要产生响应所必需的次数即可。
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。