PATCH和PUT请求之间的主要区别是什么?
我在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结构来将来自服务器的数据来回发送到客户端。 如果我们想删除一个字段,我们可以使用类似于$ 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
要求我必须把所有两个参数是first
和last
因此必须再次发送所有值
补丁 :
patch
请求说。 只发送你想要update
的data
,而不会影响或改变其他数据。
所以不需要再次发送所有的值。 只是我想,所以我需要发送只更新我的名字first
名字进行更新。
上一篇: What is the main difference between PATCH and PUT request?