首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PATCH和PUT请求的主要区别是什么?

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

Stack Overflow用户
提问于 2014-02-09 23:13:00
回答 10查看 134.3K关注 0票数 225

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

EN

回答 10

Stack Overflow用户

发布于 2014-02-09 23:33:20

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

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

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

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

补丁(

)方法请求将请求实体中描述的一组改变应用于由请求URI标识的资源。改变集以被称为由媒体类型标识的“补丁文档”的格式来表示。如果Request-URI不指向现有资源,则服务器可以根据补丁文档类型(是否可以逻辑地修改空资源)和权限等来创建新资源。

PUT和PATCH请求之间的差异反映在服务器处理封闭实体以修改由Request-URI标识的资源的方式上。在PUT请求中,封装的实体被认为是源站上存储的资源的修改版本,客户端请求替换存储的版本。然而,使用PATCH,时,所包含的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以产生新版本。补丁方法影响由-URI标识的资源,并且它还可能对其他资源具有副作用;即,可以通过应用补丁来创建新资源或修改现有资源。

据我所知,补丁动词并没有像在rails应用程序中那样使用……据我所知,RFC补丁动词应该用来发送补丁指令,就像你在两个文件之间做比较一样。不是再次发送整个实体,而是发送一个可能比重新发送整个实体小得多的补丁。

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

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

以这个例子为例:

代码语言:javascript
运行
复制
db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

我们可以有这样的东西:

代码语言:javascript
运行
复制
PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }

最后但并非最不重要的一点是,人们可以对HTTP动词说任何他们想说的话。只有一个真相,而真相就在RFC中。

票数 156
EN

Stack Overflow用户

发布于 2015-02-17 17:46:51

我花了几个小时在谷歌上找到了答案here

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

代码语言:javascript
运行
复制
PUT /users/123/email
new.email@example.org

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

代码语言:javascript
运行
复制
PATCH /users/123
[description of changes]

为什么选择Patch

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

关于补丁的说明

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

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

代码语言:javascript
运行
复制
PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]

Here有关put和patch的详细信息

票数 125
EN

Stack Overflow用户

发布于 2016-11-11 03:10:49

put:

如果我想更新我的first名称,那么我会发送一个put请求:

代码语言:javascript
运行
复制
{ "first": "Nazmul", "last": "hasan" } 

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

修补程序:

另一方面,patch请求说:只需指定需要updatedata,它就不会影响或更改其他数据。

因此,不需要再次发送所有值。我只需要更改first名称吗?那么,在patch请求中指定first就足够了。

票数 85
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21660791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档