我在Rails应用程序中使用PUT请求。现在,浏览器实现了一个新的HTTP动词PATCH。所以,我想知道PATCH和PUT请求之间的主要区别是什么,以及我们什么时候应该使用其中一个或另一个。
当前回答
HTTP动词可能是HTTP协议中最神秘的东西之一。它们确实存在,而且数量很多,但它们为什么存在呢?
Rails似乎想要支持许多动词,并添加了一些web浏览器本身不支持的动词。
下面是http动词的详尽列表:http://annevankesteren.nl/2007/10/http-methods
来自官方RFC的HTTP补丁:https://datatracker.ietf.org/doc/rfc5789/?include_text=1
The PATCH method requests that a set of changes described in the request entity be applied to the resource identified by the Request- URI. The set of changes is represented in a format called a "patch document" identified by a media type. If the Request-URI does not point to an existing resource, the server MAY create a new resource, depending on the patch document type (whether it can logically modify a null resource) and permissions, etc. The difference between the PUT and PATCH requests is reflected in the way the server processes the enclosed entity to modify the resource identified by the Request-URI. In a PUT request, the enclosed entity is considered to be a modified version of the resource stored on the origin server, and the client is requesting that the stored version be replaced. With PATCH, however, the enclosed entity contains a set of instructions describing how a resource currently residing on the origin server should be modified to produce a new version. The PATCH method affects the resource identified by the Request-URI, and it also MAY have side effects on other resources; i.e., new resources may be created, or existing ones modified, by the application of a PATCH.
据我所知,PATCH动词不像在rails应用程序中那样被使用……根据我的理解,RFC补丁动词应该用于发送补丁指令,比如当你在两个文件之间执行差异时。不是再次发送整个实体,而是发送一个比重新发送整个实体小得多的补丁。
假设您想编辑一个巨大的文件。你编辑3行。你只需要发送diff就可以了,而不是把文件发送回去。从好的方面来看,发送补丁请求可以用来异步合并文件。版本控制系统可能会使用PATCH谓词远程更新代码。
另一个可能的用例与NoSQL数据库有点相关,它可以存储文档。假设我们使用JSON结构在服务器和客户端之间来回发送数据。如果我们想要删除一个字段,我们可以使用类似于mongodb中$unset的语法。实际上,mongodb中用于更新文档的方法可能用于处理json补丁。
举个例子:
db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
我们可以有这样的东西:
PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }
最后,但并非最不重要的是,人们可以随心所欲地谈论HTTP动词。真相只有一个,而真相就在rfc中。
其他回答
HTTP动词可能是HTTP协议中最神秘的东西之一。它们确实存在,而且数量很多,但它们为什么存在呢?
Rails似乎想要支持许多动词,并添加了一些web浏览器本身不支持的动词。
下面是http动词的详尽列表:http://annevankesteren.nl/2007/10/http-methods
来自官方RFC的HTTP补丁:https://datatracker.ietf.org/doc/rfc5789/?include_text=1
The PATCH method requests that a set of changes described in the request entity be applied to the resource identified by the Request- URI. The set of changes is represented in a format called a "patch document" identified by a media type. If the Request-URI does not point to an existing resource, the server MAY create a new resource, depending on the patch document type (whether it can logically modify a null resource) and permissions, etc. The difference between the PUT and PATCH requests is reflected in the way the server processes the enclosed entity to modify the resource identified by the Request-URI. In a PUT request, the enclosed entity is considered to be a modified version of the resource stored on the origin server, and the client is requesting that the stored version be replaced. With PATCH, however, the enclosed entity contains a set of instructions describing how a resource currently residing on the origin server should be modified to produce a new version. The PATCH method affects the resource identified by the Request-URI, and it also MAY have side effects on other resources; i.e., new resources may be created, or existing ones modified, by the application of a PATCH.
据我所知,PATCH动词不像在rails应用程序中那样被使用……根据我的理解,RFC补丁动词应该用于发送补丁指令,比如当你在两个文件之间执行差异时。不是再次发送整个实体,而是发送一个比重新发送整个实体小得多的补丁。
假设您想编辑一个巨大的文件。你编辑3行。你只需要发送diff就可以了,而不是把文件发送回去。从好的方面来看,发送补丁请求可以用来异步合并文件。版本控制系统可能会使用PATCH谓词远程更新代码。
另一个可能的用例与NoSQL数据库有点相关,它可以存储文档。假设我们使用JSON结构在服务器和客户端之间来回发送数据。如果我们想要删除一个字段,我们可以使用类似于mongodb中$unset的语法。实际上,mongodb中用于更新文档的方法可能用于处理json补丁。
举个例子:
db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
我们可以有这样的东西:
PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }
最后,但并非最不重要的是,人们可以随心所欲地谈论HTTP动词。真相只有一个,而真相就在rfc中。
把: 如果我想更新我的名字,那么我发送一个put请求:
{ "first": "Nazmul", "last": "hasan" }
但是这里有一个使用put请求的问题:当我想发送put请求时,我必须发送所有两个参数,这是第一个和最后一个(而我只需要更新第一个),所以必须再次与put请求一起发送它们。
补丁: 另一方面,补丁请求说:只指定你需要更新的数据,它不会影响或改变其他数据。 所以不需要再次发送所有值。我只需要改名字吗?只需要在补丁请求中指定第一个。
在进行更新时,PUT over PATCH有一些限制。使用PUT要求我们指定所有属性,即使我们只想更改一个属性。 但是如果我们使用PATCH方法,我们可以只更新我们需要的字段,而不需要提及所有的字段。PATCH不允许修改数组中的值,也不允许删除属性或数组项。
Put和Patch方法类似。但是在rails中有不同的方法 如果我们想要更新/替换整个记录,那么我们必须使用Put方法。 如果我们想要更新特定的记录使用补丁方法。
我花了几个小时在谷歌上,在这里找到了答案
把= > 如果用户可以更新记录的全部或部分,则使用PUT(用户控制更新内容)
PUT /users/123/email
new.email@example.org
补丁= > 如果用户只能更新部分记录,比如一个电子邮件地址(应用程序控制可以更新的内容),则使用PATCH。
PATCH /users/123
[description of changes]
为什么补丁
PUT方法需要更多的带宽或处理全部资源而不是部分。因此,为了降低带宽,引入了PATCH。
PATCH说明
PATCH是一种不安全的方法,也不是幂等的,并且允许对其他资源进行全部和部分更新以及副作用。
PATCH是一种方法,它所包含的实体包含一组指令,描述如何修改当前驻留在原始服务器上的资源以产生新版本。
PATCH /users/123
[
{ "op": "replace", "path": "/email", "value": "new.email@example.org" }
]
这里有更多关于put和patch的信息
推荐文章
- 什么是“升级-不安全-请求”HTTP报头?
- HTTP 301和308状态码有什么区别?
- 什么HTTP状态码应该用于错误的输入
- 编排microservices
- 如何使HTTP请求在PHP和不等待响应
- PATCH和PUT请求的主要区别是什么?
- 我可以把我所有的http://链接都改成//吗?
- URL为AJAX请求编码一个jQuery字符串
- 我能把已经分裂的大块头和少不要脸的人分开吗?
- 编译System.Net.HttpClient的查询字符串
- 摘要认证和基本认证的区别是什么?
- Axios -删除请求与请求体和头?
- 如何在http获取请求设置报头?
- 如何使用Ruby on Rails进行HTTP请求?
- REST API最佳实践:查询字符串中的参数vs请求体中的参数