我在我的Rails 应用中使用了 PUT
请求。现在,浏览器已经实现了一个新的HTTP动词 PATCH
。所以,我想知道 PATCH
和 PUT
请求之间的主要区别是什么,并且我们应该在何时使用其中之一。
我在我的Rails 应用中使用了 PUT
请求。现在,浏览器已经实现了一个新的HTTP动词 PATCH
。所以,我想知道 PATCH
和 PUT
请求之间的主要区别是什么,并且我们应该在何时使用其中之一。
想象一下,你想编辑一个大文件。你只编辑了3行。你只需要发送差异就可以了,而不是把整个文件都发回去。另外,发送补丁请求还可以用于异步合并文件。版本控制系统可以潜在地使用动词来远程更新代码。
另一个可能的用例与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的更多信息
PATCH
与POST
、PUT
等不同,因为它修改了您的数据(具有副作用)。与GET
、OPTIONS
等安全方法不同,您可以多次调用这些端点而不会产生任何副作用。 - Mike Doe“需要一种新的方法来提高互操作性并防止错误。”在多并行环境中,如果只有包含其余有效负载的PUT请求,则会增加修改资源的其他属性的风险。PATCH解决了这个问题。 - Tomasz Nazar
put:
如果我想要更新我的first
名字,那么我发送一个put请求:
{ "first": "Nazmul", "last": "hasan" }
但是使用put
请求存在一个问题:当我想发送put
请求时,我必须发送所有两个参数,即first
和last
(而我只需要更新first
),因此必须再次发送它们以进行put
请求。
patch:
另一方面,patch
请求表示:仅指定需要update
的data
,不会影响或更改其他数据。因此,无需再次发送所有值。我只需要更改first
名字吗?在patch
请求中,仅需指定first
即可。
以下是HTTP协议中POST、PUT和PATCH方法的不同之处。
POST
HTTP.POST方法总是在服务器上创建一个新资源。这是一个非幂等请求,即如果用户两次发送相同的请求,则会在没有约束条件的情况下创建另一个新资源。
HTTP POST方法类似于SQL中的INSERT查询,它总是在数据库中创建一个新记录。
示例:使用POST方法保存新用户、订单等,其中后端服务器为新资源决定资源ID。
PUT
在HTTP.PUT方法中,首先从URL中标识资源,如果存在,则更新该资源;否则,创建一个新资源。当目标资源存在时,用全新的内容覆盖该资源。也就是说,HTTP.PUT方法用于创建或更新资源。
HTTP PUT方法类似于SQL中的MERGE查询,根据给定的记录是否存在,插入或更新记录。
PUT请求是幂等的,即连续发送相同的请求会更新现有记录(不会创建新记录)。在PUT方法中,客户端决定资源ID,并在请求URL中提供该ID。
示例:使用PUT方法更新现有用户或订单。
PATCH
HTTP.PATCH方法用于对资源进行部分修改,即增量更新。
http patch方法类似于SQL中的UPDATE查询,仅设置或更新所选列,而不是整行。
例如:您可以使用PATCH方法来更新订单状态。
PATCH /api/users/40450236/order/10234557
请求正文: {status: '已交付'}
我的一位讲师购买了一辆阿尔法·罗密欧。它的发动机有缺陷(真是个意外)。
解决这个问题有两种方式:
不为提及品牌而道歉。
他会唠叨着说,当他抱怨时,经销商竟然当面嘲笑他。
如果你制造有缺陷的汽车,并且拒绝替换它们(通过你的经销商),那你就应该得到即将到来的声誉。“意大利垃圾”。这是一个实至名归的声誉。想要可靠性?买日本车。
例子:
GET toyota_inspection # inspect the car at the dealership, see the new Toyota
POST toyota_path # manufacture the car
PUT toyota_path ## (you should know the answer to this one!?)
PATCH toyota_path, params: {engine: 4_cyclinder, seats: nappa_leather} ## What is this doing?
在进行更新时,PUT和PATCH都有其局限性。使用PUT需要我们指定所有属性,即使我们只想更改一个属性也是如此。 但是,如果我们使用PATCH方法,我们可以仅更新所需的字段,而无需提及所有字段。 PATCH不允许我们修改数组中的值或删除属性或数组条目。
// This is just a example.
firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..
当我们想要更新整个记录时,我们必须使用 Http
的 PUT
动词。
例如:
// 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。而在patch
请求中,只发送要更新的参数,不会影响或更改其他数据。
更多详情请访问:https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/
PUT和PATCH方法在本质上相似,但有一个关键的区别。
PUT - 在PUT请求中,被包含的实体将被视为服务器上资源的修改版本,并将被此修改实体替换。
PATCH - 在PATCH请求中,被包含的实体包含一组指令,指导如何修改服务器上的实体以生成新版本。
Put方法和Patch方法相似。但在Rails中,它们有不同的用法。 如果我们想要更新/替换整个记录,则必须使用Put方法。 如果我们想要更新特定记录,则使用Patch方法。