2011-06-28 55 views
8

我有一个RESTful Web服务,它表示进程和活动。每个活动都在一个且只有一个过程内。 我想表示它在当前进程和另一个进程之间的“移动”操作。在RESTful架构中移动资源

我看了论坛,发现人们建议使用MOVE操作,这是不是很标准,其他建议使用PUT,但是我不知道如何分辨PUT和PUT之间的差异,看起来语义错误。

任何想法?

回答

3

如果使用PUT,则可以通过现有实体的过程是否与新过程相匹配来区分差异。

PUT /process1/activity2\n\n 
process: 2 
some_data: and_stuff 

到的合乎逻辑的反应(如果成功的话)是

303 See Other\n 
Location /process2/activity2 
+0

您可能还想使用“204无内容”而不是303:http://grzegorzborkowski.blogspot.nl/2009/04/relocating-resources-with-restful-web.html – mb21

8

一种方式是表示,此举本身,比方说,“转移”资源(转移作为名词),和POST一个新问题:

POST /transfer 

包含一个实体:

activity: /activities/4 
toProcess: /processes/13 

这样,客户端正在创建新的“传输”,在服务器上处理验证和传输活动。

这使您可以添加有关传输的信息。如果您想保留审计历史记录,则可以将transferredBy属性添加到资源或transferredOn日期。

+0

嗨,这是有趣的想法。我没有想过使用传输本身作为资源,但我想这就是REST的全部内容。 你认为通过创建(发布)新的传输资源来改变另一个资源是很好的吗? –

+1

是的,那很好。 POST不必是[idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2),所以它可能有副作用。 –

+0

+1。这也是我也想到的方式。我认为每当移动同时影响容器(包含元素的列表)和包含的元素(它的父链接字段)时,它比包含元素上的PUT更干净。但是,我想知道REST是否在这个意义上是干净的。无论何时我们把孩子放在父母身上,假设父母有PUT可以吗?或者我们应该关心即使在查看任何客户端提出的实际请求的完整集合时也能保持正确的正确性? –