【问题标题】:RESTful services and update operationsRESTful 服务和更新操作
【发布时间】:2013-03-20 12:07:17
【问题描述】:

我知道 REST 是面向资源的,它粗略地转化为使用标准 HTTP 方法对这些资源进行的 CRUD 操作。但我只想更新资源的部分

例如,假设我有Payment 资源,我想将其状态标记为“paid”。我不想通过 HTTP POST 整个 Payment 对象(有时我什至没有所有数据)。

这样做的 RESTful 方式是什么?我已经看到 Twitter 对updating Twitter statuses 使用了以下方法:

http://api.twitter.com/1/statuses/update.xml?status=playing with cURL and the Twitter API

这种方法是否符合 REST 的“精神”?

更新:PUT -> POST

我在此期间找到的一些链接:

【问题讨论】:

  • 您链接的那篇“PUT 不是 UPDATE”文章有一个重要的 SQL 倾斜。在更改端点之前阅读 cmets。

标签: rest


【解决方案1】:

这样做的理想方法是更改​​资源的一部分(子资源)并让服务器返回带有 Location 标头的 303 See Other 以指向更改后的资源。 303 See Other 告诉客户端,作为请求的结果,其他一些资源已经改变,客户端应该更新它持有的表示。

在您的示例中(当然是假设的媒体类型):

1. 客户端检索支付表示 获取/付款/2 200 好的 内容类型:应用程序/支付+xml 支付> 2.客户端更新状态 PUT /payments/2/状态 内容类型:文本/纯文本 已付 303 查看其他 位置:/付款/2 3.客户端遵循303重定向 获取/付款/2 200 好的 内容类型:应用程序/支付+xml 支付>

【讨论】:

  • @Jan,是的,既然我已经深入研究了 REST PUT/POST 文章,我想我理解了这个概念。
【解决方案2】:

POST 应该用于修改资源

编辑:Martin Fowler 的文章 Richardson Maturity Model 是对 REST 的非常好的介绍。

【讨论】:

  • @Dominik,实际上它比这更复杂一些。请参阅我在问题中添加的链接。
【解决方案3】:

PATCH 有什么问题? “部分修改”问题似乎需要它,特别是考虑到有时您没有获得“替换它”所需的所有数据...... 但老实说,我认为虔诚地遵循“POST = 创建,PUT = 替换,PATCH = 更新”理念没有任何意义,而且我认为只使用 POST 没有任何问题。

【讨论】:

  • PATCH 具有与之关联的特殊语法。请参阅pending JSON PATCH IETF standard 了解更多信息。
  • “虔诚地遵循它并没有错”……这似乎是 Web 开发人员的常态……无所顾忌地做事,不遵循标准或规则。我确实看到它有问题。
【解决方案4】:

我猜,这就是 POST 的用途:“CRUD”中的“U”。

您将数据发布到现有资源。资源决定如何处理它,并得到更新。此外,POST 数据可能只是完整资源的一部分。

Twitter 的方法恕我直言不是 RESTful,因为它们重载了 GET。

【讨论】:

  • Boldewyn,我认为 PUT 是为了更新。看起来对此感到困惑:维基百科说一件事(en.wikipedia.org/wiki/…),还有其他声音(16cards.com/2007/03/10/the-cafes-put-is-not-update)。片段:这意味着 XSD 不能强制执行任何强制内容(主键除外)?
  • PUT 和 POST 的意思正是 HTTP 规范中所写的内容。不多也不少。 PUT 意味着“用此状态替换资源的当前状态”意义上的更新,而 POST 仅意味着“处理这个(根据您的性质)”。您可以使用 POST 对子资源(例如 POST /payments/2/post-here)进行部分更新,但您需要定义所有有效负载类型。使用 303 的 PUT 方法更简单。
  • Twitter 的 API 不是 RESTful,因为它不使用媒体类型语义,而是提供可用资源和操作的静态描述。那不是 REST(这并不意味着它没有用)。更新似乎需要 POST,所以至少我没有看到 twitter 使用无副作用方法 (GET) 进行更改操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多