Answers:
HTTP动词可能是HTTP协议中最隐秘的事物之一。它们存在,并且有很多,但是为什么存在呢?
Rails似乎希望支持许多动词并添加一些Web浏览器本身不支持的动词。
这是http动词的详尽列表:http: //annevankesteren.nl/2007/10/http-methods
那里有来自官方RFC的HTTP补丁:https : //datatracker.ietf.org/doc/rfc5789/? include_text =1
该PATCH方法请求一组在所述请求实体所描述的改变被应用到由所述请求- URI标识的资源。变更集以一种称为“补丁文件”的格式表示,该格式由媒体类型标识。如果Request-URI没有指向现有资源,则服务器可以根据补丁文档类型(是否可以逻辑上修改空资源)和权限等来创建新资源。
PUT和PATCH请求之间的差异体现在服务器处理封闭实体以修改由Request-URI标识的资源的方式。在PUT请求中,封闭的实体被视为原始服务器上存储的资源的修改版本,并且客户端正在请求替换存储的版本。但是,对于PATCH,封闭的实体包含一组指令,这些指令描述了应如何修改当前驻留在源服务器上的资源以产生新版本。该PATCH 方法影响由标识的资源请求URI,也 MAY对其他资源有副作用;即,可以通过应用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中。
我在Google花了几个小时,在这里找到了答案
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
等(安全方法)相比,您可以多次调用端点而没有任何副作用。
放置,
如果我想更改我的first
名字,则发送放置更新请求
{ "first": "Nazmul", "last": "hasan" }
但这里有一个问题是put
要求,当我要发送put
的请求,我必须把所有两个参数是first
和last
因此它是强制性的再次发送所有的价值
补丁:
patch
要求说。只发送data
您想要的update
那个,不会影响或更改其他数据。
因此,无需再次发送所有价值。我只想更新我的名字,所以我只需要发送first
名字来更新。
这是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
请求正文:{状态:“已交付”}
在进行更新时,通过PATCH进行PUT时存在一些限制。使用PUT要求我们指定所有属性,即使我们只想更改一个属性。但是,如果我们使用PATCH方法,则只能更新所需的字段,而无需提及所有字段。PATCH不允许我们修改数组中的值或删除属性或数组条目。
PUT和PATCH方法本质上相似,但是有一个关键的区别。
PUT-在PUT请求中,封闭的实体将被视为驻留在服务器上的资源的修改版本,并将其替换为该修改后的实体。
PATCH-在PATCH请求中,封闭的实体包含一组指令,该指令集将对驻留在服务器上的实体进行修改以产生较新版本的方式。
根据HTTP术语,该PUT
请求就像数据库更新语句一样。
PUT
-用于修改现有资源(以前为POSTED)。另一方面,该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 VS POST:
使用PUT
请求时,我们必须发送所有参数,例如firstName,lastName,email,phoneNumber,而在In patch
请求中,仅发送我们要更新的参数,而不会影响或更改其他数据。
有关更多详细信息,请访问:https : //fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/
Put和Patch方法相似。但是在rails中它具有不同的方法如果要更新/替换整个记录,则必须使用Put方法。如果要更新特定记录,请使用Patch方法。