ASP.NET Core Web API - PUT 与 PATCH

Posted

技术标签:

【中文标题】ASP.NET Core Web API - PUT 与 PATCH【英文标题】:ASP.NET Core Web API - PUT vs PATCH 【发布时间】:2021-10-12 04:01:19 【问题描述】:

我一直在学习如何使用 official documentation 构建 ASP.NET Core Web API。但是,在 PUT 部分下它说:

根据 HTTP 规范,PUT 请求需要客户端发送整个更新的实体,而不仅仅是更改。要支持部分更新,请使用 HTTP PATCH。

我知道 POST 用于创建新资源,PUT 用于更新特定资源。但我无法理解“整个更新的实体,而不仅仅是更改”是什么意思。

【问题讨论】:

【参考方案1】:

我不明白“整个更新的实体,而不仅仅是更改”是什么意思。

您应该查看描述 semantics of PUT. 的 HTTP 规范

给定表示的成功 PUT 表明,对同一目标资源的后续 GET 将导致在 200(OK)响应中发送等效表示。

这里的表示是指将作为 GET 请求的有效负载出现的字节。对于网页,我们谈论的是 html。对于以 application/json 响应的资源,我们谈论的是整个 json 文档。


也就是说,如果你想创建/编辑一个 json 文档,并将其保存在 web 服务器上,那么你使用 HTTP PUT,请求的负载应该是整个 JSON 文档。

如果 JSON 文档非常大(比 HTTP 标头大得多)并且您所做的更改很小,那么您可能会选择在补丁请求中发送更改,其中请求的有效负载是补丁文件(可能是JSON Patch 或JSON Merge Patch

现在,这里有一个神奇的技巧——网络上的每个人都以同样的方式理解 HTTP 请求。 PUT 总是意味着 PUT,PATCH 总是意味着 PATCH。因此,您可以使用 PUT 和 PATCH 对 Web 上并非真正文档但可能是其他内容(如实体)的内容进行更改。

这几乎就是 HTTP API 的意义所在 - 它是一种外观(从外部看)使我们的服务看起来就像另一个 Web 服务器。

您的资源实际上是数据库中的行而不是文件系统上的文档这一事实是隐藏在 Web API 后面的实现细节。

【讨论】:

【参考方案2】:

假设你有一个像下面这样的 json 数据


     "Id":123,
     "FirstName":"John",
     "MiddleName":"Random",
     "LastName":"Doe"

假设,您想在此处更改中间名。你想删除它。您可以同时使用 put 和 patch 来执行此操作。

PUT

在这里,您必须在请求中发送整个新实体(json 模型的更改状态)。 虽然您只是更改了中间名部分,但完整的 json 数据正在请求负载中发送

PUT /user?id=123

     "Id":123,
     "FirstName":"John",
     "MiddleName":"", //Only this is being changed.
     "LastName":"Doe"

补丁

在这种情况下,您只能发送旧模型和新模型之间的差异,就是这样。 因此,在这种情况下,仅发送更改,而不是整个更新的实体

PATCH /user?id=123

     "MiddleName":"", //Only this is being changed.

当您只想编辑大型对象的几个属性时,使用 PATCH 会很方便。

【讨论】:

我想知道http客户端如何知道在补丁情况下应该发送什么部分?为什么您只是不回答几乎没有人再对 API 使用 put 或 patch 了。例如,并非所有浏览器都支持补丁。 这正是我的想法。但是,当我尝试以下 PUT 请求时:"MiddleName" : "" 它仍然有效。所以我假设这更像是一种“最佳实践”。

以上是关于ASP.NET Core Web API - PUT 与 PATCH的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

ASP.NET Core Web Api 自动帮助页面

ASP.NET Core Web API

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?