我在我的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
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中。
我花了几个小时与谷歌,并找到答案here
PUT =>如果用户可以更新记录的全部或部分,请使用PUT(用户控制更新的内容)
PUT /users/123/email
[email protected]
PATCH =>如果用户只能更新部分记录,比如说只是一个电子邮件地址(应用程序控制可以更新的内容),请使用PATCH。
PATCH /users/123
[description of changes]
为什么Patch
PUT
方法需要更多带宽或处理完整资源而不是部分。因此引入PATCH
来减少带宽。
关于PATCH的说明
PATCH
是一种不安全,也不是幂等的方法,允许对其他资源进行全面和部分更新以及副作用。
PATCH
是一种方法,其中封闭实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本。
PATCH /users/123
[
{ "op": "replace", "path": "/email", "value": "[email protected]" }
]
Here有关put和patch的更多信息
放
如果我想更改myfirst
名称,则发送更新请求
{ "first": "Nazmul", "last": "hasan" }
但这里有一个问题是put
要求当我想发送put
请求时我必须发送所有两个参数,即first
和last
所以必须再次发送所有值
补丁:
patch
请求说。只发送你想要的data
update
,它不会影响或改变其他数据。
所以不需要再发送所有价值。只是我想更新我的名字,所以我只需要发送first
名称进行更新。
在进行更新时,PUT优于PATCH。使用PUT要求我们指定所有属性,即使我们只想更改一个属性。但是如果我们使用PATCH方法,我们只能更新我们需要的字段,并且不需要提及所有字段。 PATCH不允许我们修改数组中的值,也不允许删除属性或数组条目。
以下是HTTP协议的POST,PUT和PATCH方法之间的区别。
POST
HTTP.POST方法始终在服务器上创建新资源。它是一个非幂等请求,即如果用户点击相同的请求2次,如果没有约束,它将创建另一个新资源。
http post方法类似于SQL中的INSERT查询,它始终在数据库中创建新记录。
示例:使用POST方法保存新用户,订单等后端服务器决定新资源的资源ID。
放
在HTTP.PUT方法中,首先从URL中识别资源,如果存在,则更新资源,否则创建新资源。当目标资源存在时,它将使用完整的新主体覆盖该资源。即HTTP.PUT方法用于创建或更新资源。
http put方法类似于SQL中的MERGE查询,它根据给定记录是否存在来插入或更新记录。
PUT请求是幂等的,即两次命中相同的请求将更新现有记录(没有创建新记录)。在PUT方法中,资源id由客户端决定并在请求URL中提供。
示例:使用PUT方法更新现有用户或订单。
补丁
HTTP.PATCH方法用于对资源的部分修改,即增量更新。
http补丁方法类似于SQL中的UPDATE查询,它仅设置或更新所选列,而不是整行。
示例:您可以使用PATCH方法更新订单状态。
PATCH / api / users / 40450236 / order / 10234557
请求正文:{status:'Delivered'}
PUT和PATCH方法本质上是相似的,但有一个关键的区别。
PUT - 在PUT请求中,所包含的实体将被视为驻留在服务器上的资源的修改版本,并且它将被此修改的实体替换。
PATCH - 在PATCH请求中,随附的实体包含一组指令,这些指令表示如何修改驻留在服务器上的实体以生成更新的版本。
Put和Patch方法类似。但是在rails中它有不同的metod如果我们想要更新/替换整个记录,那么我们必须使用Put方法。如果我们想要更新特定记录使用Patch方法。
根据HTTP术语,PUT
请求就像数据库更新语句一样。 PUT
- 用于修改现有资源(以前为POSTED)。另一方面,PATCH
请求用于更新现有资源的某些部分。
例如:
顾客信息:
// This is just a example.
firstName = "James";
lastName = "Anderson";
email = "[email protected]";
phoneNumber = "+92 1234567890";
//..
当我们想要更新到整个记录?我们必须使用Http
PUT
verb
。
如:
// Customer Details Updated.
firstName = "James++++";
lastName = "Anderson++++";
email = "[email protected]";
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/