我在Rails应用程序中使用PUT请求。现在,浏览器实现了一个新的HTTP动词PATCH。所以,我想知道PATCH和PUT请求之间的主要区别是什么,以及我们什么时候应该使用其中一个或另一个。


当前回答

Put和Patch方法类似。但是在rails中有不同的方法 如果我们想要更新/替换整个记录,那么我们必须使用Put方法。 如果我们想要更新特定的记录使用补丁方法。

其他回答

Put和Patch方法类似。但是在rails中有不同的方法 如果我们想要更新/替换整个记录,那么我们必须使用Put方法。 如果我们想要更新特定的记录使用补丁方法。

HTTP动词可能是HTTP协议中最神秘的东西之一。它们确实存在,而且数量很多,但它们为什么存在呢?

Rails似乎想要支持许多动词,并添加了一些web浏览器本身不支持的动词。

下面是http动词的详尽列表:http://annevankesteren.nl/2007/10/http-methods

来自官方RFC的HTTP补丁:https://datatracker.ietf.org/doc/rfc5789/?include_text=1

The PATCH method requests that a set of changes described in the request entity be applied to the resource identified by the Request- URI. The set of changes is represented in a format called a "patch document" identified by a media type. If the Request-URI does not point to an existing resource, the server MAY create a new resource, depending on the patch document type (whether it can logically modify a null resource) and permissions, etc. The difference between the PUT and PATCH requests is reflected in the way the server processes the enclosed entity to modify the resource identified by the Request-URI. In a PUT request, the enclosed entity is considered to be a modified version of the resource stored on the origin server, and the client is requesting that the stored version be replaced. With PATCH, however, the enclosed entity contains a set of instructions describing how a resource currently residing on the origin server should be modified to produce a new version. The PATCH method affects the resource identified by the Request-URI, and it also MAY have side effects on other resources; i.e., new resources may be created, or existing ones modified, by the application of a PATCH.

据我所知,PATCH动词不像在rails应用程序中那样被使用……根据我的理解,RFC补丁动词应该用于发送补丁指令,比如当你在两个文件之间执行差异时。不是再次发送整个实体,而是发送一个比重新发送整个实体小得多的补丁。

假设您想编辑一个巨大的文件。你编辑3行。你只需要发送diff就可以了,而不是把文件发送回去。从好的方面来看,发送补丁请求可以用来异步合并文件。版本控制系统可能会使用PATCH谓词远程更新代码。

另一个可能的用例与NoSQL数据库有点相关,它可以存储文档。假设我们使用JSON结构在服务器和客户端之间来回发送数据。如果我们想要删除一个字段,我们可以使用类似于mongodb中$unset的语法。实际上,mongodb中用于更新文档的方法可能用于处理json补丁。

举个例子:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

我们可以有这样的东西:

PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }

最后,但并非最不重要的是,人们可以随心所欲地谈论HTTP动词。真相只有一个,而真相就在rfc中。

我花了几个小时在谷歌上,在这里找到了答案

把= > 如果用户可以更新记录的全部或部分,则使用PUT(用户控制更新内容)

PUT /users/123/email
new.email@example.org

补丁= > 如果用户只能更新部分记录,比如一个电子邮件地址(应用程序控制可以更新的内容),则使用PATCH。

PATCH /users/123
[description of changes]

为什么补丁

PUT方法需要更多的带宽或处理全部资源而不是部分。因此,为了降低带宽,引入了PATCH。

PATCH说明

PATCH是一种不安全的方法,也不是幂等的,并且允许对其他资源进行全部和部分更新以及副作用。

PATCH是一种方法,它所包含的实体包含一组指令,描述如何修改当前驻留在原始服务器上的资源以产生新版本。

PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]

这里有更多关于put和patch的信息

下面是HTTP协议的POST、PUT和PATCH方法的区别。

POST

一个HTTP。POST方法总是在服务器上创建一个新资源。这是一个非幂等的请求,即如果用户点击相同的请求2次,如果没有约束,它将创建另一个新的资源。

http post方法类似于SQL中的INSERT查询,它总是在数据库中创建一个新记录。

示例:使用POST方法保存新用户、订单等,其中后端服务器决定新资源的资源id。

PUT

在HTTP。PUT方法,资源首先从URL中识别,如果它存在,则更新它,否则创建一个新资源。当目标资源存在时,它会用一个全新的主体覆盖该资源。这就是HTTP。PUT方法用于创建或更新资源。

http put方法类似于SQL中的MERGE查询,它根据给定的记录是否存在插入或更新记录。

PUT请求是幂等的,即两次命中相同的请求将更新现有的记录(没有创建新的记录)。在PUT方法中,资源id由客户端决定,并在请求url中提供。

示例:使用PUT方法更新现有用户或订单。

补丁

一个HTTP。PATCH方法用于对资源的部分修改,即增量更新。

http补丁方法类似于SQL中的UPDATE查询,它只设置或更新选定的列,而不是整行。

示例:您可以使用PATCH方法更新订单状态。

-火\用户40450236 /订单/补丁10234557

请求正文:{状态:'已交付'}

在进行更新时,PUT over PATCH有一些限制。使用PUT要求我们指定所有属性,即使我们只想更改一个属性。 但是如果我们使用PATCH方法,我们可以只更新我们需要的字段,而不需要提及所有的字段。PATCH不允许修改数组中的值,也不允许删除属性或数组项。