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


186

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

Answers:


139

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,也 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
重要的是要注意,RFC 5789仍处于提议阶段,尚未被正式接受,目前被标记为“存在irrata”。这种“最佳实践”受到了激烈的争论,技术上PATCH尚未成为HTTP标准的一部分。这里唯一的事实是,由于RFC不被接受,因此您不应该这样做。
fishpen0

3
即使它仍在提议中,也不意味着不应该使用它。如果是这种情况,我们将无法使用仍在提案中的websockets和许多其他rfcs ...提案的实施要比其他人没有实施的完全自定义项目好100倍。
卢瓦克福雷-拉克鲁瓦

BS。它不是“提议中的”,而是HTTP标准的一部分(该标准,RFC 7231委托给IANA注册中心以获取方法,并且PATCH在此处列出)。
朱利安·瑞施

@JulianReschke,如果您阅读此RFC的第二行,您会看到它仍被标记为PROPOSED STANDARD。所以不,补丁方法仍在提议中。射频在这里顺便说一句。tools.ietf.org/html/rfc5789和rfc7231也是建议标准。如果你看一下RFC821例如,它被标记为Internet标准
卢瓦克福雷-拉克鲁瓦

1
@JulianReschke en.wikipedia.org/wiki/Internet_Standard#Proposed_Standard ......这不是我的话。提议的标准并不意味着您不能像我上面解释的那样很好地实现它。这并不意味着它不够稳定,无法实施...但是它仍在提议中,除非将其标记为Internet Standard ...我不确定您对此有何看法。它被称为“提议的标准”,除了提议之外,别无其他。如果您想提出建议的标准可以使用。这正是我写的。
卢瓦克福雷-拉克鲁瓦

104

我在Google花了几个小时,在这里找到了答案

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" }
]

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


7
为什么此PATCH不安全?
比什什特·巴塔(Bishisht Bhatta)2016年

1
PATCH其中POSTPUT等是不是“安全”的,因为它修改您的数据(有副作用)。与GETOPTIONS等(安全方法)相比,您可以多次调用端点而没有任何副作用。
emix

1
引入PATCH并不是为了唯一地节省带宽。如RFC 5789所述:>“必须采用一种新方法来提高互操作性并防止错误。” 在仅具有包括其余有效负载的PUT的多并行环境中,将增加修改资源其他属性的风险。PATCH解决了此类问题。
Tomasz Nazar

43

放置,
如果我想更改我的first名字,则发送放置更新请求

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

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

补丁
patch要求说。只发送data您想要的update那个,不会影响或更改其他数据。
因此,无需再次发送所有价值。我只想更新我的名字,所以我只需要发送first名字来更新。


13

这是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

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


这是任何人都无法阅读的关于put和patch的最糟糕的解释。此外,在已经发布了这么多好的答案之后,是什么让您认为这里的答案与众不同?
CodeHunter

3

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


1

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

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

PATCH-PATCH请求中,封闭的实体包含一组指令,该指令集将对驻留在服务器上的实体进行修改以产生较新版本的方式。


1

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.