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

use*_*063 169 patch http put http-verbs

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

Loï*_*oix 129

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未指向现有资源,则服务器可以创建新资源,具体取决于补丁文档类型(是否可以在逻辑上修改空资源)和权限等.

PUTPATCH请求之间的差异反映在服务器处理封闭实体以修改Request-URI标识的资源的方式中.在PUT请求中,封闭的实体被认为是存储在源服务器上的资源的修改版本,并且客户端正在请求替换所存储的版本.但是,对于PATCH,随附的实体包含一组指令,这些指令描述了如何修改当前驻留在源服务器上的资源以生成新版本.PATCH 方法影响由标识的资源请求URI,也 可能对其他资源的副作用; 即,可以通过应用PATCH来创建新资源,或者修改现有资源.

据我所知,PATCH动词不会像在rails应用程序中那样使用......据我所知,RFC补丁动词应该用于发送补丁指令,就像在两个文件之间进行差异时一样.您可以发送一个比重新发送整个实体小得多的补丁,而不是再次发送整个实体.

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

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

以此为例:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)
Run Code Online (Sandbox Code Playgroud)

我们可以这样:

PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }
Run Code Online (Sandbox Code Playgroud)

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

  • 即使它仍在提案中,但并不意味着它不应该被使用.如果是这种情况,我们将无法使用websockets和许多仍在提案中的其他rfcs ...实现提案比实现完全自定义的其他人没有实现的东西好100倍. (3认同)

Sel*_*ani 95

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

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

PUT /users/123/email
new.email@example.org
Run Code Online (Sandbox Code Playgroud)

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

PATCH /users/123
[description of changes]
Run Code Online (Sandbox Code Playgroud)

为什么 Patch

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

关于PATCH的说明

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

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

PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么这个PATCH不安全? (6认同)
  • `POST`、`PUT` 等之间的`PATCH` 不是“安全的”,因为它会修改您的数据(有副作用)。与“GET”、“OPTIONS”等(安全方法)相比,您可以多次调用端点而没有任何副作用。 (2认同)
  • 引入 PATCH 并不是为了单独节省带宽。正如 RFC 5789 所述: > “需要一种新方法来提高互操作性和防止错误。” 在只有包含其余负载的 PUT 的多并行环境中,会增加修改资源其他属性的风险。PATCH 解决了这样的问题。 (2认同)

Naz*_*san 38


,如果我想改变我的first名字,那么发请求更新

{ "first": "Nazmul", "last": "hasan" } 
Run Code Online (Sandbox Code Playgroud)

但这里有一个问题被put要求,当我要发送put的请求,我必须把所有两个参数是firstlast
因此它是强制性的再次发送所有的价值

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

  • IMO,这是最直接的答案。 (8认同)
  • 快速且易于理解! (2认同)
  • 我也最喜欢,直接进入正题!完美的 (2认同)
  • 长话短说 (2认同)

小智 6

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


Reh*_*hah 5

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

例如:

顾客信息:

// This is just a example.

firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..
Run Code Online (Sandbox Code Playgroud)

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

例如:

// Customer Details Updated.

firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我们只想更新记录的一部分而不是整个记录,那么请选择Http PATCH verb. 例如:

   // Only Customer firstName and lastName is Updated.

    firstName = "Updated FirstName";
    lastName = "Updated LastName";
   //..
Run Code Online (Sandbox Code Playgroud)

放置与发布:

使用PUT请求时,我们必须发送所有参数,例如名字、姓氏、电子邮件、电话号码,其中patch请求中仅发送我们想要更新的参数,它不会影响或更改其他数据。

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


小智 5

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

开机自检

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

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

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

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

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

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

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

补丁

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

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

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

修补程序/ api / users / 40450236 / order / 10234557

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


BKS*_*eon 5

类比解释

Hungry Jack's(墨尔本的一家汉堡连锁店)在处理有问题的订单时会使用 put/patch 请求:

我点了一个汉堡。肉有点陈旧。

(A) 放置请求

通常,他们会完全更换坏汉堡:这就像一个放置请求。

(B) 补丁请求

或者他们可以用更新鲜的肉饼代替不新鲜的肉,给我留下我最初吃的小圆面包、生菜、番茄酱等。

在这种特殊情况下,用放置请求完全替换资源(即汉堡)要容易得多。

但是,您可以看到补丁请求是如何有用的:

例如,如果我的大型摩天大楼有一个小缺陷——也许修补缺陷会更容易,而不是完全更换摩天大楼。