用于REST的HTTP MODIFY动词?

时间:2009-11-04 06:34:12

标签: http rest http-headers

据我所知,没有RESTful方法可以对资源进行修改。为了做到这一点,你必须将资源作为一个整体,覆盖以前的表示。我认为这是问题的根源,特别是当资源具有大的表示时。

我相信这暗示了HTTP1.1中缺少动词:类似于MODIFY或PATCH。甚至连WebDAV都没有这个动词(它有PROPPATCH,其概念类似,但不适用于资源)。

当前的HTTP 1.1动词集对现实世界的REST还不是很有限吗?

修改:我在IETF找到了有关PATCH动词的提案

http://tools.ietf.org/html/draft-dusseault-http-patch-15

  

此规范定义了新的   HTTP / 1.1 [RFC2616]方法PATCH   用于申请部分   对资源的修改。

     

需要一种新方法   提高互操作性并防止   错误。 PUT方法已经存在   定义为覆盖资源   有一个完整的新身体,不能   被重用来做部分改变。   否则,代理和缓存甚至   客户和服务器可能会得到   混淆了结果   操作。 PATCH被提到了   早期的HTTP规范,但不是   完全定义。

据我所知,这种动词的唯一问题是缺乏幂等性。

修改:截至2010年3月,RFC 5789存在(PATCH Method for HTTP)。

4 个答案:

答案 0 :(得分:8)

您可以将资源划分为可单独更新的子资源。

E.g。您有一个 / user 资源代表您可以创建 / user / email 子资源的用户帐户信息,然后在其上执行PUT以仅更新电子邮件。

答案 1 :(得分:7)

您可以使用POST进行部分更新。它并不理想,但它相当RESTful。

答案 2 :(得分:2)

有充分的理由没有这样的动词来做到这一点。管理几乎是不可能的。想想100个客户以这种方式修改相同的资源,你怎么知道你的修改到底在哪里?如果订单很重要,并且你的“补丁”实际上是在另一个“补丁”之后添加的,那么你现在要添加的内容实际上不是添加的内容。将PUT与ETag标头一起使用是一种更为理智的方法来修改资源,然后尝试将一些新动词与未知结果混在一起。实际获得资源是一个很小的代价,可以为可重复的结果付出代价。

答案 3 :(得分:1)

我希望有像......这样的标准化和支持的动词。

  • 查找,搜索或查询 - 因此很明显,请求不是 资源,而是其他资源的位置。也许只是有限的用处。
  • 移动,复制,链接 - 只是该死的方便,它们的行为类似于命令行工具。
  • DISCOVER,MAP,INDEX或SITEMAP - 这样您就可以获得资源布局,概念类似于wsdl文件或xmlrpc的system.listMethods。
  • BEGIN,ACQUIRE或LOCK,以及COMMIT,END,DONE或RELEASE - 在您开始和结束交易或使用中间资源时明确说明。
  • MODIFY,UPDATE,PATCH - 因为我们都想要它