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标识的资源。 该组变化以由媒体types标识的称为“补丁文档”的格式表示。 如果Request-URI不指向现有资源,则服务器可以根据补丁文档types(是否可以在逻辑上修改空资源)和权限等创build新资源。

PUTPATCH请求之间的差异反映在服务器处理封闭实体以修改由Request-URI标识的资源的方式中。 在PUT请求中,封闭的实体被认为是存储在源服务器上的资源的修改版本,并且客户端正在请求replace存储的版本。 但是,对于PATCH ,封闭的实体包含一组说明,说明当前驻留在源服务器上的资源如何修改以生成新的版本。 PATCH方法会影响Request-URI所标识的资源,也可能对其他资源产生副作用; 即通过应用PATCH可以创build新的资源,或者修改现有的资源。

据我所知, PATCH动词不被使用,因为它是在rails应用程序中……据我所知,RFC补丁动词应该用来发送补丁说明,就像在两个文件之间做差异时一样。 不是再发送整个实体,而是发送一个可能比重新发送整个实体小得多的补丁。

想象一下,你想编辑一个巨大的文件。 你编辑3行。 而不是发回文件,你只需要发送差异。 另外,发送补丁请求可以用来asynchronous合并文件。 版本控制系统可以使用PATCH动词远程更新代码。

另一个可能的用例与NoSQL数据库有些相关,可以存储文档。 假设我们使用JSON结构来从服务器向客户端发送来回数据。 如果我们想删除一个字段,我们可以使用类似于$ unset的 mongodb语法。 实际上,mongodb用来更新文档的方法可能被用来处理json补丁。

以这个例子:

 db.products.update( { sku: "unknown" }, { $unset: { quantity: "", instock: "" } } ) 

我们可以有这样的东西:

 PATCH /products?sku=unknown { "$unset": { "quantity": "", "instock": "" } } 

最后但并非最不重要的是,人们可以对HTTP动词做任何他们想要的事情。 只有一个事实,事实是在RFC中。

我花了几个小时与谷歌,在这里find答案

PUT => 如果用户可以更新logging的全部或部分 ,可以使用PUT(用户控制什么更新)

 PUT /users/123/email new.email@example.org 

PATCH => 如果用户只能更新一个部分logging ,比如说一个电子邮件地址(应用程序控制什么可以更新),那么使用PATCH。

 PATCH /users/123 [description of changes] 

为什么Patch

PUT方法需要更多的带宽或部分处理全部资源。 所以引入PATCH来减less带宽。

有关PATCH的说明

PATCH是一种不安全,也不幂等的方法,允许对其他资源进行完全和部分的更新和副作用。

PATCH是一种方法,封闭的实体包含一组说明如何修改当前驻留在源服务器上的资源以产生新版本的指令。

 PATCH /users/123 [ { "op": "replace", "path": "/email", "value": "new.email@example.org" } ] 

这里有更多关于put和patch的信息


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

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

但这里有一个问题是请求,当我想发送请求我必须发送所有两个参数是firstlast
所以必须重新发送所有的值

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