Hug*_*own 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冲突更危险,因为某些补丁格式需要从已知的基点操作,否则它们将破坏资源.使用这种补丁应用程序的客户端应该使用条件请求,如果自客户端上次访问资源以来资源已更新,请求将失败.例如,客户端可以在PATCH请求的If-Match标头中使用强ETag [RFC2616].

  • +1我可以补充说,通过包含`If-Match`标题,可以使`PATCH`成为**幂等**,如你所指的RFC中所述.在RFC中实际上强烈建议这样做,因为将补丁应用到错误的版本可能会搞砸引用,而PUT只是替换整个事物. (20认同)
  • 这应该标记为正确的答案 (7认同)