如何在REST中建模动作?

时间:2011-04-06 20:03:44

标签: ruby-on-rails rest

假设我有Task和TimePeriod。 TimePeriod表示我使用start_time和end_time字段处理任务的时间。

我想让Task支持启动/停止任务。 Start将使用当前时间创建一个新的TimePeriod。 Stop会将end_time添加到最后一个TimePeriod。

我在想REST URL将是这样的: PUT / tasks / 1011?do = start PUT / tasks / 1011?do = stop

或者也许 PUT / tasks / 1011 / start PUT / tasks / 1011 / stop

制作这种REST风格的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

我认为Paul非常接近,但重要的是要注意纯REST需要一个对象/名词作为资源。请记住,我不是REST最纯粹的,我只是投入0.02美元,因为这与REST直接相关。这可能在技术上更正确:

Request: 
  POST /tasks/1011/timeperiod
Response: 201 Created response status with a Location header that points to 
  GET /tasks/1011/timeperiod/(identifier)

您应该可以使用/ tasks / 1011 / timeperiod /(标识符)来更新它。停止时间可能涉及PUT,重置(或者更确切地说是删除)涉及DELETE的时间。您的状态页面应该在他们实际登陆GET / tasks / 1011 / timeperiod /(标识符)时随时出现。

考虑对象/ id的键值对。 GET中的参数不是必需的。

答案 1 :(得分:1)

在使用REST来利用统一接口时,您希望尽可能符合HTTP方法定义。使用此规则,您不希望使用PUT或查询字符串来传递操作。 PUT不适合,因为它将用于替换资源。

POST将是您想要使用的方法。 POST /tasks/1011/start最好使用响应代码 303 将其重定向到状态页(如果您的用例需要)或代码 400 (如果启动失败)。类似于停止任务。

我强烈推荐使用RESTful Web Services Cookbook作为本答案的指南,它涵盖了其他常见的REST问题。

答案 2 :(得分:1)

这是另一种选择。像这样检索任务,

GET /task/1011

然后开始任务,像这样POST,

POST /ActiveTasks  

并结束任务,

POST /InactiveTasks   

实际上,如果对任务资源使用以下表示形式,URI的外观并不重要:

<Task>
  <Description>Do some stuff</Description>
  <Status>Active</Status>
  <Link rel="end" Method="POST" href="/InactiveTasks"/>
</Task>

<Task>
  <Description>Do some stuff</Description>
  <Status>InActive</Status>
  <Link rel="start" Method="POST" href="/ActiveTasks"/>
</Task>

请注意,任何时候只有一个链接可用,具体取决于任务当前是否处于活动状态