【问题标题】:How to model an action in REST?如何在 REST 中为动作建模?
【发布时间】:2011-04-07 07:49:40
【问题描述】:

假设我有 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

或者也许 放置 /tasks/1011/开始 PUT /tasks/1011/stop

制作这种 REST 样式的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails rest


    【解决方案1】:

    我认为 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/(identifier) 来更新它。停止时间可能涉及 PUT,重置(或更确切地说是删除)时间将涉及 DELETE。您的状态页面应该会在他们实际登陆 GET /tasks/1011/timeperiod/(identifier) 时出现。

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

    【讨论】:

    • 同意资源应该是宾语/名词。我处理这个问题的一种方法是资源是一个动作的控制器,这是一个权衡,我们想要采取的许多动作不适合 HTTP 定义的方法。这只是一个命名更改,然后您将拥有/tasks/1011/start_controller。也可以为主控制器提出一个论点,其中要执行的操作在请求正文 POST /task/1011/controller action=start 中,但我会调查与此相关的权衡。
    • 对我(个人)来说,我可以看到建议的任何方式。我只是想了解 REST 的核心以及 mbdev 所询问的 URI 模式问题。我尽量不把 REST 看作是一套法律,而更多地把它看作一套策略,并使用常识将它们应用于问题。
    • 在 REST 方面使用此策略是正确的,但在客户端实现起来很复杂。由于停止任务需要使用 PUT 和 javascript 放置当前日期。虽然一个动作可以在服务器端处理这个,这更容易。
    【解决方案2】:

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

    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>
    

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

    【讨论】:

    • 除非我看到更简单的方法,否则我更喜欢这种方法。该方案也将适用于更多场景。例如,现在我有一个项目,我必须“确认”一个项目的更新操作。我们将通过向项目发送一个确认 URL 来实现它。
    【解决方案3】:

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

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

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

    【讨论】:

    • POST 用于创建资源,在这种情况下,任务已经存在。所以 PUT 可能更好地指示状态更改为已启动/已停止
    • 正确的是,POST 通常用于创建您希望服务器控制新资源所在位置的资源,但它的定义足够广泛,可以用于其他目的。 PUT 有一个幂等的概念,归结为多次请求相同的资源应该具有相同的效果,在这种情况下,这听起来不是你想要的。另一方面,POST 不是幂等的。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多