假设我有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风格的正确方法是什么?
答案 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>
请注意,任何时候只有一个链接可用,具体取决于任务当前是否处于活动状态