Ruby on rails 如何在REST中建模动作?

Ruby on rails 如何在REST中建模动作?,ruby-on-rails,rest,Ruby On Rails,Rest,假设我有任务和时间段。TimePeriod表示我使用开始时间和结束时间字段处理任务的时间 我希望任务支持启动/停止任务。Start将使用当前时间创建一个新的时间段。停止将向最后一个时间段添加结束时间 我想剩下的URL应该是这样的: PUT/tasks/1011?do=start PUT/tasks/1011?do=停止 或许 PUT/tasks/1011/start 放置/任务/1011/停止 创建此REST样式的正确方法是什么?在使用REST利用统一接口时,您希望尽可能遵守HTTP方法定义。使

假设我有任务和时间段。TimePeriod表示我使用开始时间和结束时间字段处理任务的时间

我希望任务支持启动/停止任务。Start将使用当前时间创建一个新的时间段。停止将向最后一个时间段添加结束时间

我想剩下的URL应该是这样的: PUT/tasks/1011?do=start PUT/tasks/1011?do=停止

或许 PUT/tasks/1011/start 放置/任务/1011/停止


创建此REST样式的正确方法是什么?

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

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


我强烈推荐RESTfulWebServicesCookbook,因为我用它作为回答这个问题的指南,它涵盖了其他常见的REST问题。

我认为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,重置(或者更确切地说删除)时间可能涉及删除。您的状态页面应该在它们实际到达GET/tasks/1011/timeperiod/(标识符)时出现


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

这里有一个替代方案。像这样检索任务

GET /task/1011
然后开始任务,像这样发布它

POST /ActiveTasks  
为了完成任务,

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

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

做点什么
活跃的


做点什么
不活跃的

请注意,根据任务当前是否处于活动状态,在任何时候只有一个链接可用

POST用于创建资源,在这种情况下,任务已经存在。因此,PUT最好指示状态更改为started/stoppedCorrect,POST通常用于创建一个资源,您希望服务器控制新资源的位置,但它的定义足够广泛,可以用于其他目的。PUT有一个幂等的概念,可以归结为多次请求相同的资源应该具有相同的效果,在这种情况下,听起来并不是您想要的效果。另一方面,POST不是幂等的。约定的资源应该是对象/名词。我处理这个问题的一种方法是,资源是一个操作的控制器,这是一种权衡,因为我们想要采取的许多操作都不适合HTTP定义的方法。这只是一个命名更改,您可以使用
/tasks/1011/start\u controller
。您也可以为主控制器提供一个参数,其中执行的操作位于请求主体
POST/task/1011/controller action=start
,但我会调查与此相关的权衡。对于我(个人),我可以看到任何建议的方法。我只是想触及REST的核心和mbdev所问的URI模式问题。我尽量不把REST看作是一套法律,而把它看作是一套策略,并用常识将它们应用到问题中。当涉及到REST时,使用这种策略是正确的,但是在客户端实现起来很复杂。因为停止任务需要使用带有javascript的PUT放置当前日期。虽然一个操作可以在服务器端处理这个问题,但这更简单。我更喜欢这种方法,除非我看到一个更简单的方法。此解决方案也将应用于更多场景。例如,现在我有一个项目,我必须“确认”一个项目的更新操作。我们将通过发送一个确认URL来实现它。
<Task>
  <Description>Do some stuff</Description>
  <Status>InActive</Status>
  <Link rel="start" Method="POST" href="/ActiveTasks"/>
</Task>