PATCH和PUT请求的主要区别是什么?

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

154073 次浏览

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

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

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

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

补丁方法请求在补丁中描述的一组更改 请求实体应用于由request -标识的资源 URI。更改集以一种称为“补丁”的格式表示 由媒体类型标识的文档。如果Request-URI没有 指向一个现有资源,服务器五月创建一个新资源, 根据补丁文件类型(是否可以逻辑修改 空资源)和权限等 补丁请求之间的区别反映在 服务器处理封闭实体以修改资源的方式 由Request-URI标识。在请求中,所包含的实体 对象上存储的资源的修改版本 源服务器,客户端请求存储的版本是 更换。然而,对于补丁,所包含的实体包含一组 控件上的资源当前如何驻留的说明 应修改原服务器以生成新版本。补丁 . 方法影响要求通用标识的资源,并且它也 五月对其他资源有副作用;也就是说,可能会有新的资源 补丁.

. {/p> .

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

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

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

举个例子:

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

我们可以有这样的东西:

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

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

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

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

PUT /users/123/email
new.email@example.org
< p > 补丁 = > 如果用户只能更新部分记录,假设只是一个电子邮件地址(应用程序控制可以更新的内容),则使用PATCH。

PATCH /users/123
[description of changes]

为什么Patch

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

关于补丁的解释

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

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

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

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

< p > 把: < br > 如果我想更新我的first名称,那么我发送一个请求:

{ "first": "Nazmul", "last": "hasan" }

但是这里有一个使用put请求的问题:当我想发送put请求时,我必须发送所有两个参数,即firstlast(而我只需要更新first),所以必须再次使用put请求发送它们。

< p > 补丁: < br > 另一方面,patch请求说:只指定你需要updatedata,它不会影响或改变其他数据。
所以不需要再次发送所有值。我是否只需要更改first名称?在patch请求中只指定first就足够了

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

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

补丁方法在本质上是相似的,但有一个关键的区别。

-在请求中,所包含的实体将被认为是驻留在服务器上的资源的修改版本,它将被这个修改的实体所取代。

补丁 -在补丁请求中,封闭的实体包含一组指令,说明驻留在服务器上的实体将如何被修改以产生一个新版本。

根据HTTP术语,PUT请求就像一个数据库更新语句。 PUT -用于修改现有资源(先前已发布)。另一方面,PATCH请求用于更新现有资源的某些部分

例如:

客户详细信息:

// This is just a example.


firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..

当我们想要更新到整个记录?为此,我们必须使用Http PUT verb

如:

// Customer Details Updated.


firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..
另一方面,如果我们只想更新记录的一部分而不是整个记录,则使用Http PATCH verb如:< / >强

   // Only Customer firstName and lastName is Updated.


firstName = "Updated FirstName";
lastName = "Updated LastName";
//..

Put和post:

当使用PUT请求时,我们必须发送所有参数,如firstName, lastName, email, phoneNumber,在patch请求中,只发送我们想要更新的参数,它不会影响或改变其他数据。

更多详情请访问:https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/

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

帖子

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

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

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

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

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

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

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

补丁

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

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

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

补丁/ api /用户/ 40450236 /订单/ 40450236

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

PUT和PATCH的差异 PUT请求和PATCH请求之间的主要区别在于服务器处理封闭实体以更新Request-URI标识的资源的方式。在发出PUT请求时,所包含的实体被视为保存在原始服务器上的资源的修改版本,客户机正在请求替换它。然而,使用PATCH,所包含的实体拥有一组指令,描述如何对存储在原始服务器上的资源进行部分修改以创建新版本

第二个区别是当涉及到等幂的时候。HTTP PUT被称为幂等的,因为它总是在每次发出几个请求后产生相同的结果。另一方面,HTTP PATCH基本上被认为是非幂等的。然而,根据执行的位置,可以使它成为幂等的。

类比解释

我买了辆阿尔法罗密欧。它的引擎有缺陷(真令人惊讶)

有两种方法可以解决这个问题:

  • 替换整辆车(请求),或者
  • 只需更换有缺陷的引擎(补丁请求)-即"patch"把车拆掉,而不是把它完全换掉。

最后我以相当大的损失把汽车卖回给经销商。我买阿尔法狼活该。