为什么要使用PUT而不是PATCH?

时间:2015-03-03 00:26:54

标签: http http-method

从I understand开始,PUT请求发送整个对象,而PATCH请求只发送diff,用于更新数据库中的对象。

为什么要在PATCH上进行PUT? PATCH似乎很多更轻。我没有看到PUT的任何好处(我确定它们存在,我只是不知道它们是什么)。

4 个答案:

答案 0 :(得分:2)

更好的方法是PUT 替换资源,而PATCH则用于提供更改资源的指令。

替换资源始终是一种安全且幂等的操作,因为它不依赖于资源的现有状态。同时,更改资源的请求可能取决于该资源的状态,因此可能会产生其他影响。

HTTP PATCH谓词在RFC 5789中定义,其中声明:

  

PUT和PATCH请求之间的区别反映在     服务器处理封闭实体以修改资源的方式     由Request-URI标识。在PUT请求中,包含的实体     被认为是存储在该资源上的资源的修改版本     原始服务器,客户端请求存储的版本     被替换。但是,使用PATCH,随附的实体包含一个集合     描述资源当前如何驻留在     应修改原始服务器以生成新版本。 PATCH     方法会影响Request-URI标识的资源     也可能对其他资源产生副作用;即新资源     可以通过应用a来创建或修改现有的     PATCH。

接着说:

  

PATCH既不安全也不是幂等

答案 1 :(得分:1)

您可能希望创建资源,或者可能没有适用的PATCH格式(想想二进制文件)。

答案 2 :(得分:0)

  • 使用POST作为创建资源的唯一选项
  • 仅具有JSON资源(RFC 7396
  • 使PATCH端点实现具有幂等性

是否仍然需要在API中提供PUT端点?

Maybe I don't want to take the diff and deduce where I should save it so that everything makes sense. Maybe I just want to work with full resources instead of messing around with little parts of them. >>您也可以使用PATCH进行全面更新,不是吗?

答案 3 :(得分:-1)

HTTP标准的相当一部分已经过时,因此PATCH可以完全取代PUT也就不足为奇了。

在RESTful API中,人们经常误认为PUT是“更新整个资源”,但实际上PUT的语义是“替换资源”。不幸的是,HTTP中有一个可悲的设计:PUT被定义为在不存在新资源时创建新资源,因此PUT有时被用作POST的幂等替代品。

PATCH在某种程度上是对PUT的模仿,因此它也包含了POST的部分职责。但是,如果只想执行“修改现有资源”的操作,则只需要使用PATCH(PATCH不是幂等的,这是HTTP的另一种可悲的设计)。

深入研究REST和HTTP标准方法的人最终会发现,简单的RPC接口可以更好地实现您所需的所有操作。