如何在REST中支持部分更新(PATCH)

时间:2011-11-15 06:42:03

标签: rest patch partial openrasta

3 个答案:

答案 0 :(得分:92)

根据RFC5789(http://tools.ietf.org/html/rfc5789),这正是PATCH的用途:

  

扩展超文本传输​​协议(HTTP)的几个应用程序      需要一个功能来进行部分资源修改。现有的      HTTP PUT方法仅允许完全替换文档。      此提议添加了一个新的HTTP方法PATCH来修改现有方法      HTTP资源。

PATCH和PUT之间的区别描述如下:

  

PUT和PATCH请求之间的区别反映在      服务器处理封闭实体以修改资源的方式      由Request-URI标识。在PUT请求中,包含的实体      被认为是存储在该资源上的资源的修改版本      原始服务器,客户端请求存储的版本      被替换。但是,使用PATCH,随附的实体包含一个集合      描述资源当前如何驻留在      应修改原始服务器以生成新版本。

还描述了POST的局限性:

  

PUT方法已定义为覆盖资源      具有完整的新体,并且不能重复使用来进行部分更改。      否则,代理和缓存,甚至客户端和服务器都可能获得      混淆了操作的结果。 POST已被使用但是      没有广泛的互操作性(对于一个,没有标准的方法      发现补丁格式支持)[...]

我建议你阅读RFC并自己决定,但对我来说这似乎相当明确 - PATCH请求应该作为部分更新处理。 (注意,与PUT不同,它们不是幂等的。)

编辑:正如Eugene在评论中指出的那样,虽然PATCH请求是"neither safe nor idempotent as defined by [RFC2616]",但它们可以这样做:

  

PATCH请求可以以幂等的方式发出,      这也有助于防止两者之间发生冲突造成的不良后果      PATCH在相似的时间范围内对同一资源进行请求。      来自多个PATCH请求的冲突可能比更危险      PUT冲突,因为一些补丁格式需要从a操作      已知的基点,否则它们会破坏资源。客户端      使用这种补丁应用程序应该使用条件请求      如果资源已更新,请求将失败      因为客户端上次访问了资源。例如,客户端      可以在PATCH上的If-Match标头中使用强大的ETag [RFC2616]      请求。

答案 1 :(得分:0)

您应该使用RFC-7386“json merge PATCH”中描述的方法PATCH。

E.g。如果你想改变“a”的值并删除资源中的“f”,如:

   {
     "a": "b",
     "c": {
       "d": "e",
       "f": "g"
     }
   }

您可以通过发送:

来实现此目的
       PATCH /target HTTP/1.1
       Host: example.org
       Content-Type: application/merge-patch+json

       {
         "a":"z",
         "c": {
           "f": null
         }
       }

答案 2 :(得分:-16)

PATCH将与补丁格式一起使用,仅用于文档级修补(也就是实际表示中的差异)。它用于其他目的是可疑和有争议的,并且不清楚该方法是否为非媒体类用途而设计。

一般情况下,POST是正确的方法,但您可能希望将资源拆分为多个资源,而是修改它们。

[为清晰而编辑,因为有些人不读评论]