PATCH和PUT请求之间的主要区别是什么?

我在Rails应用程序中使用了PUT请求。 现在,浏览器已经实现了一个新的HTTP动词PATCH 。 所以,我想知道PATCHPUT请求之间的主要区别是什么,以及何时应该使用其中一个或另一个。


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结构来将来自服务器的数据来回发送到客户端。 如果我们想删除一个字段,我们可以使用类似于$ unset的mongodb语法的语法。 实际上,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的信息



如果我想改变我的first名字,然后发送了更新PUT请求

{ "first": "Nazmul", "last": "hasan" } 

但这里有一个问题被put请求时,我想送put要求我必须把所有两个参数是firstlast
因此必须再次发送所有值

补丁
patch请求说。 只发送你想要updatedata ,而不会影响或改变其他数据。
所以不需要再次发送所有的值。 只是我想,所以我需要发送只更新我的名字first名字进行更新。

链接地址: http://www.djcxy.com/p/41009.html

上一篇: What is the main difference between PATCH and PUT request?

下一篇: AngularJs $http.post() does not send data