如何提交RESTful部分更新?

时间:2008-10-24 00:02:01

标签: rest http-put

Web服务的作者Sam Ruby似乎反对使用HTTP PUT进行部分更新:http://intertwingly.net/blog/2008/02/15/Embrace-Extend-then-Innovate

不清楚的是应该进行部分更新。正如我在其博客底部附近评论的那样,目前尚不清楚使用HTTP PATCH比使用针对HTTP PUT的“补丁文档”更好。

值得注意的是,虽然Sam反对滥用HTTP PUT,但他似乎并不主张使用HTTP PATCH。

如何提交RESTful部分更新?

4 个答案:

答案 0 :(得分:21)

从您引用的博客文章中的评论中可以看出,没有达成一致的方式来进行部分更新。如果Sam Ruby,Joe Gregario,Mark Nottingham,Mark Pilgrim,BilldehÓra等重量级人物无法达成协议,我们有什么希望。

就我而言,我不会太担心。创建适合您的部分更新媒体类型,使用PATCH指示您的意图以及最终在通用媒体类型上达成协议时,将服务器更改为接受这两种格式。

要感谢如果您的REST api提交的最严重的罪行是滥用PUT / PATCH,那么您的表现相当不错。

答案 1 :(得分:16)

现在是2013年 - 您应该使用PATCH进行部分更新 - 使用json-patch(请参阅http://tools.ietf.org/html/rfc6902http://www.mnot.net/blog/2012/09/05/patch)或xml-patch文档(请参阅http://tools.ietf.org/html/rfc7351) 。在我看来,json-patch最适合您的业务数据。

使用JSON / XML补丁文档的PATCH具有非常严格的部分更新前向语义。如果您开始使用POST,并使用原始文档的修改副本,对于部分更新,您很快就会遇到问题,您希望缺少值(或者更确切地说,空值)来表示“忽略此属性”或“将此属性设置为空值“ - 这导致了一个被黑客入侵的解决方案的漏洞,最终将导致您自己的补丁格式。

您可以在此处找到更深入的答案:http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html

更新:这是RPC吗?

好吧,如果您将RPC定义为向服务器发送命令,那么任何和所有HTTP操作都是RPC调用 - 无论您获取资源,PUT新表示还是再次删除它 - 每个操作都包含一个发送命令(动词)GET / PUT / DELETE等和可选的有效载荷。只是发生了HTTP工作组(或曾经是谁)引入了一个新的动词PATCH,它允许客户端对资源进行部分更新。

如果除了将完整表示发送到服务器之外的任何内容都被视为RPC样式,则根据定义,部分更新不能是RESTful。人们可以选择这种观点,但网络基础设施背后的人说的不同 - 因此为此目的定义了一个新的动词。

RPC更多的是通过HTTP以一种对Web上的中间人不可见的方式进行隧道方法调用 - 例如使用SOAP来包装方法名称和参数。这些操作是“不可见的”,因为没有标准定义有效载荷内的方法和参数。

将此与PATCH与媒体类型application / json-patch相比较 - 操作的意图对于Web上的任何中介都清晰可见,因为动词PATCH具有明确定义的含义,并且有效载荷在另一个定义良好的公共中编码网络上的共同权威机构(IETF)拥有的可用格式。最终结果是每个人的完全可见性,没有特定于应用程序的秘密语义。

REST也是关于“偶然重用”的,这正是应用程序/ json-patch的PATCH - 重用现有标准而不是发明大致相同的应用程序特定协议。

答案 2 :(得分:4)

您可以为资源的一部分提供自己的URI,而不是自制酿造部分更新媒体类型并使用尚未标准的PATCH方法。

答案 3 :(得分:1)

HTTP PATCH现在有一个RFC - HTTP PATCH RFC