我想为我的资源实现部分更新,因为我拥有大量资源并希望从中更新部分信息。我已经通过以下链接但不是 能够弄清楚是否使用HTTP POST或PATCH方法。
How to submit RESTful partial updates?
http://jacobian.org/writing/rest-worst-practices/
https://github.com/archiloque/rest-client/issues/79
http://tools.ietf.org/html/draft-dusseault-http-patch-16
http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-06.html
http://jasonsirota.com/rest-partial-updates-use-post-put-or-patch
http://bitworking.org/news/296/How-To-Do-RESTful-Partial-Updates
https://github.com/dharmafly/jsonpatch.js
请为此建议任何有效的解决方案。
答案 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是正确的方法,但您可能希望将资源拆分为多个资源,而是修改它们。
[为清晰而编辑,因为有些人不读评论]