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

时间:2014-02-09 15:13:00

标签: http patch put httpverbs

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

10 个答案:

答案 0 :(得分:117)

HTTP动词可能是关于HTTP协议最神秘的事情之一。它们存在,而且有很多,但它们为什么存在?

Rails似乎想要支持许多动词并添加一些本机不支持Web浏览器的动词。

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

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

  

PATCH 方法请求中描述的一组更改   请求实体应用于请求所标识的资源 -   URI。这组更改以称为“补丁”的格式表示   文档“由媒体类型标识。如果Request-URI没有   指向现有资源,服务器 MAY 创建一个新资源,   取决于补丁文档类型(是否可以在逻辑上修改   空资源)和权限等。

     

PUT PATCH 请求之间的差异反映在   服务器处理封闭实体以修改资源的方式   由Request-URI标识。在 PUT 请求中,包含的实体   被认为是存储在该资源上的资源的修改版本   原始服务器,客户端请求存储的版本   更换。 但是,使用 PATCH ,随附的实体包含一组   说明资源当前如何驻留在   应修改原始服务器以生成新版本。 PATCH   方法会影响 Request-URI 标识的资源,它也会影响    MAY 对其他资源有副作用;即,新资源可能是   通过应用 PATCH 创建或修改现有的

据我所知, PATCH 动词未被使用,因为它在rails应用程序中......据我所知,RFC补丁动词应该用于发送补丁指令,就像你在在两个文件之间做差异。您可以发送一个比重新发送整个实体小得多的补丁,而不是再次发送整个实体。

想象一下,你想编辑一个巨大的文件。您编辑3行。您只需发送差异,而不是发回文件。从好的方面来说,发送补丁请求可以用于异步合并文件。版本控制系统可能会使用 PATCH 动词远程更新代码。

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

举个例子:

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

我们可以这样:

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

最后,但并非最不重要的是,人们可以说出他们想要的关于HTTP动词的任何内容。只有一个事实,事实是在RFC中。

答案 1 :(得分:86)

我花了几个小时与谷歌一起找到答案here

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

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

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

PATCH /users/123
[description of changes]

为什么Patch

PUT方法需要更多带宽或处理完整资源而不是部分。因此引入PATCH来减少带宽。

关于 PATCH

的说明

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

PATCH是一个方法,其中包含的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本。

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

Here有关put和patch的更多信息

答案 2 :(得分:34)

put
如果我想更改我的first名称,请发送 put 请求更新

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

但有一个问题是put请求当我想发送put请求时,我必须发送firstlast
所以必须再次发送所有值

补丁
patch请求说。只发送data您想要的update,但它不会影响或更改其他数据。
所以不需要再发送所有价值。只是我想更新我的名字,所以我只需要发送first名称进行更新。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

PUT PATCH 方法本质上相似,但有一个关键区别。

PUT -在 PUT 请求中,封闭的实体将被视为驻留在服务器上的资源的修改后的版本,并将被该修改后的实体替换。

PATCH -在 PATCH 请求中,包含的实体包含一组指令,该指令集将修改如何修改驻留在服务器上的实体以产生更新的版本。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

根据HTTP术语,onPause请求就像数据库更新语句一样。 PUT-用于修改现有资源(以前为POSTED)。另一方面,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

PUT VS POST:

使用 // Only Customer firstName and lastName is Updated. firstName = "Updated FirstName"; lastName = "Updated LastName"; //.. 请求时,我们必须发送所有参数,例如firstName,lastName,email,phoneNumber,而在PUT请求中,仅发送我们要更新的参数,而不会发送影响或更改其他数据。

有关更多详细信息,请访问:https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/

答案 7 :(得分:0)

以下是HTTP协议的POST,PUT和PATCH方法之间的区别。

POST

HTTP.POST方法始终在服务器上创建新资源。它是非幂等请求,即,如果用户两次击中相同请求,则在没有约束的情况下会创建另一个新资源。

http post方法就像SQL中的INSERT查询一样,总是在数据库中创建新记录。

示例:使用POST方法保存新用户,订单等,后端服务器确定新资源的资源ID。

放置

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

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

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

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

PATCH

HTTP.PATCH方法用于对资源进行部分修改,即增量更新。

http修补程序方法类似于SQL中的UPDATE查询,它仅设置或更新选定的列,而不设置或更新整个行。

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

PATCH / api / users / 40450236 / order / 10234557

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

答案 8 :(得分:0)

PUT 和 PATCH 的区别 PUT 和 PATCH 请求之间的主要区别体现在服务器处理封闭实体以更新由 Request-URI 标识的资源的方式。在发出 PUT 请求时,所包含的实体被视为原始服务器上保存的资源的修改版本,并且客户端正在请求替换它。但是,对于 PATCH,封闭的实体拥有一组说明,这些说明描述了应如何部分修改存储在原始服务器上的资源以创建新版本。

第二个区别在于幂等性。 HTTP PUT 被认为是幂等的,因为它每次发出多次请求后总是产生相同的结果。另一方面,HTTP PATCH 基本上可以说是非幂等的。但是,可以根据它的实现位置使其具有幂等性。

答案 9 :(得分:0)

类比说明

也许最好用一个故事/例子来说明差异。 Hungry Jack's(墨尔本的一家汉堡连锁店)在其餐厅处理有问题的订单时利用放置/修补请求:

我从 Hungry Jack's 点了一个汉堡。真的很糟糕:肉有点陈旧。问题可以通过两种方式解决:

(A) 放置请求

厨房人员本可以再做一个汉堡,然后完全取代我托盘上的劣质汉堡。

(B) 补丁请求

肉已经变质了。所以厨房里的人可以拿出一些新鲜的肉,并且可以简单地更换有问题的肉饼,给我留下我原来吃的汉堡,减去不新鲜的肉饼。

在这种特殊情况下,用放置请求完全替换资源(即汉堡)要容易得多。但是,您可以看到补丁请求是如何有用的。例如如果我的大型摩天大楼有一个小缺陷 - 也许修补缺陷而不是完全更换摩天大楼会更容易。