RESTful服务和更新操作

时间:2010-02-22 09:18:06

标签: rest

我知道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

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

4 个答案:

答案 0 :(得分:10)

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

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

1. Client retrieves payment representation
GET /payments/2

200 Ok
Content-Type: application/payment+xml

<payment>
  <status href="/payments/2/status" value="pending"/>
</payment>

2. Client updates status
PUT /payments/2/status
Content-Type: text/plain

payed

303 See Other
Location: /payments/2

3. Client follows the 303 redirect 
GET /payments/2

200 Ok
Content-Type: application/payment+xml

<payment>
  <status href="/payments/2/status" value="payed"/>
</payment>

答案 1 :(得分:4)

POST应该用于修改资源

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

答案 2 :(得分:0)

PATCH有什么问题? “部分修改”问题似乎需要它,特别是考虑到有时你没有得到“替换它”所需的所有数据...... 但说实话,我认为遵循“POST = create,PUT = replace,PATCH = update”这个哲学并没有任何意义,我认为只使用POST就没有错。

答案 3 :(得分:-1)

我想,这就是POST的用途:'CRUD'中的'U'。

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

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