【问题标题】:REST - PUT or PATCH when updating all properties of an entityREST - 更新实体的所有属性时的 PUT 或 PATCH
【发布时间】:2020-02-12 20:35:25
【问题描述】:

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

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

【问题讨论】:

  • 您评论的帖子没有回答我在这里提出的问题。我问的是实体的所有字段都更新的情况,包括 PUT 和 PATCH。如果使用这两种方法更新所有字段有什么区别?
  • 没有实质区别。您的所有数据字段都已更改。但是您最初的问题询问什么是“良好做法”,如果您要替换实体的全部内容,那么 PUT 被认为是正确的 HTTP 方法。在您的情况下,PATCH 是幂等的,但这并不意味着它在所有情况下都是幂等的。我相信链接问题中的详细答案仍然适用。
  • @BryanLewis 对不起,也许我表达得不好。想象一下,我确实允许部分修改。在部分修改的整个子集中也是对实体的所有元素的修改。这就是原始问题的情况发生的时候。如果我有一个更新表单并且只修改一个属性,我使用 PATCH,但如果我全部修改,我必须使用 PATCH 还是 PUT?我应该检测到这种情况并从 PATCH 切换到 PUT 吗?
  • 当您在客户端拥有此“更新表单”时,您是否真正检测到哪些字段正在更改并专门针对这些字段进行修补?如果您不是,并且您通过网络发送整个实体,那么它实际上是一个 PUT。如果您的代码逻辑只发送更改,并且有时这些更改包含实体的所有字段,那么我同意您可以坚持使用 PATCH 处理所有内容,而不必担心动态更改 HTTP 方法。

标签: rest patch put


【解决方案1】:

PUT 是幂等的,PATCH 不是。 PUTidempotent 的事实意味着通用组件可以根据需要多次重复单个请求以产生响应。

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

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

通用组件不了解是否所有字段都已更新。高级启发式是这样的:通用组件理解 HTTP 标头的语义,但不一定理解消息体的语义。

而且,在这种情况下,为什么完整资源的 PATCH 不是幂等的?

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

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

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

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

同样适用于幂等语义,以及 PUT 与 POST/PATCH。

【讨论】:

  • 我明白了。然后,想象以下场景。我有一个 CRUD 用户。如果我更新用户的字段我应该使用 PATCH,但如果我更新所有字段我应该使用 PUT?
  • 而且,在这种情况下,为什么完整资源的 PATCH 不是幂等的?它与 PUT 相同。
  • @Mr.Mars 通常您不需要选择作为服务器,在 REST 架构中,应该并且可能还会教您所需的所有信息。仅以 HTML 表单为例,其中各个表单不仅教您服务器期望的各个字段,还教您发送请求的端点 URI、编组输入数据的媒体类型以及要使用的 HTTP 操作。其中一些可能是隐式给出的,例如 application/x-www-form-urlencoded 在媒体类型的情况下,如果没有明确指定
猜你喜欢
  • 2017-02-10
  • 1970-01-01
  • 2018-05-04
  • 2019-04-01
  • 2021-01-24
  • 1970-01-01
  • 2020-10-15
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多