I am using a PUT
request in my Rails application. Now, a new HTTP verb, PATCH
has been implemented by browsers. So, I want to know what the main difference between PATCH
and PUT
requests are, and when we should use one or the other.
10 回答
HTTP 动词可能是关于 HTTP 协议最神秘的事情之一。它们存在,而且数量很多,但它们为什么存在呢?
Rails 似乎想要支持许多动词并添加一些 Web 浏览器本身不支持的动词。
这是一个详尽的 http 动词列表:http: //annevankesteren.nl/2007/10/http-methods
有来自官方 RFC 的 HTTP 补丁:https ://datatracker.ietf.org/doc/rfc5789/?include_text=1
PATCH方法请求将请求实体中描述的一组更改应用于由 Request-URI 标识的资源。这组更改以一种称为“补丁文档”的格式表示,该格式由媒体类型标识。如果 Request-URI 不指向现有资源,则服务器可以创建新资源,具体取决于补丁文档类型(是否可以在逻辑上修改空资源)和权限等。
PUT和PATCH请求之间的区别体现在服务器处理封闭实体以修改由 Request-URI 标识的资源的方式上。在PUT请求中,包含的实体被认为是存储在源服务器上的资源的修改版本,并且客户端请求替换存储的版本。然而,对于PATCH,封闭的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本。PATCH 方法影响Request-URI标识的资源,它也 可以对其他资源有副作用;即,可以通过应用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 中。
我在谷歌上花了几个小时,在这里找到了答案
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 的信息
put:
如果我想更新我的first
名字,那么我发送一个put请求:
{ "first": "Nazmul", "last": "hasan" }
但是这里有一个使用put
请求的问题:当我想发送put
请求时,我必须发送所有两个参数,即first
and last
(而我只需要更新first
),所以必须再次发送put
请求。
patch
另一方面,patch:data
request 表示:只指定您需要的update
,它不会影响或更改其他数据。
因此无需再次发送所有值。我只需要改first
名字吗?好吧,只需first
在patch
请求中指定即可。
这是 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
请求正文:{status: 'Delivered'}
比喻解释
Hungry Jack's(墨尔本的一家汉堡连锁店)在处理有问题的订单时会使用 put/patch 请求:
我点了一个汉堡。肉有点陈旧。
(A) 提出请求
通常,他们会完全替换坏汉堡:这就像一个放置请求。
(B) 补丁请求
或者他们可以用更新鲜的肉饼代替陈旧的肉,留下我原来吃的小圆面包、生菜、番茄酱等。
在这种特殊情况下,用 put 请求完全替换资源(即汉堡)要容易得多。
但是,您可以看到补丁请求可能会有所帮助:
例如,如果我的大型天空刮板有一个小缺陷 - 也许修补缺陷而不是完全更换天空刮板会更容易。
在进行更新时 PUT over PATCH 存在限制。使用 PUT 要求我们指定所有属性,即使我们只想更改一个属性。但是如果我们使用 PATCH 方法,我们可以只更新我们需要的字段,而无需提及所有字段。PATCH 不允许我们修改数组中的值,或删除属性或数组条目。
根据 HTTP 术语,PUT
请求就像一个数据库更新语句。
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
.
如:
// Only Customer firstName and lastName is Updated.
firstName = "Updated FirstName";
lastName = "Updated LastName";
//..
放置与发布:
使用PUT
请求时,我们必须发送所有参数,例如名字,姓氏,电子邮件,电话号码,其中在patch
请求中只发送我们要更新的参数,它不会影响或更改其他数据。
更多详情请访问:https ://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/
PUT和PATCH方法本质上相似,但有一个关键区别。
PUT - 在PUT请求中,包含的实体将被视为驻留在服务器上的资源的修改版本,它将被此修改的实体替换。
PATCH - 在PATCH请求中,包含的实体包含一组指令,说明如何修改驻留在服务器上的实体以生成更新版本。
Put 和 Patch 方法类似。但是在rails中它有不同的方法如果我们想更新/替换整个记录,那么我们必须使用Put方法。如果我们想更新特定记录,请使用 Patch 方法。
PUT 和 PATCH 之间的区别 PUT 和 PATCH 请求之间的主要区别在于服务器处理封闭实体以更新由 Request-URI 标识的资源的方式。发出 PUT 请求时,封闭的实体被视为保存在原始服务器上的资源的修改版本,并且客户端正在请求替换它。但是,对于 PATCH,封闭的实体拥有一组说明,这些说明描述了如何对存储在原始服务器上的资源进行部分修改以创建新版本。
第二个区别是幂等性。HTTP PUT 被认为是幂等的,因为每次发出多个请求后它总是产生相同的结果。另一方面,HTTP PATCH 基本上可以说是非幂等的。但是,可以根据实现的位置使其具有幂等性。