【发布时间】:2015-05-27 09:54:56
【问题描述】:
我们的一个 API 有一个 tasks 资源。 API 的使用者可以根据需要创建、删除和更新给定的任务。
如果任务完成(即,其状态通过PUT /tasks/<id> 更改),结果可能会自动创建一个新任务。
我们正在努力使其保持 RESTful。告诉调用用户新任务已创建的正确方法是什么?我想到了以下解决方案,但我认为它们都有缺点:
- 在
PUT响应中添加一个附加字段,其中包含有关最终新任务的信息。 - 仅返回更新的任务,并期望用户调用
GET /tasks以检查是否已创建任何新任务。
在我看来,选项 1 打破了 RESTful-ness,因为 API 预计只会返回有关更新实体的信息。选项 2 期望用户做一些事情,但如果他不这样做,那么没有人会意识到创建了一个新任务。
谢谢。
更新:PUT 调用返回一个 HTTP 200 代码以及更新任务的完整 JSON 表示。
@tophallen 建议有一个任务树,以便(如果我没记错的话)选项 2 中返回的实体包含作为直接子项的新任务。
【问题讨论】:
-
您可以尝试在响应中添加一个新标头,例如标识新任务的 X-New-Task。
-
我假设在案例 2 中您返回 202 的?是否考虑过任务树? - 我认为一个任务作为另一个任务的直接结果会被认为与更新的实体有关,因此作为结果的属性是相关的。
-
@tophallen 我们在更新后返回纯 200 和实体的完整 JSON 表示(我们遵循对整个 RESTful 范式的这种解释:stackoverflow.com/a/798174/624356)。任务树也可以是一个选项,但我想避免仅仅为了解决这个问题而使用树结构(尽管如果没有找到其他替代方案,我们可能会选择它)。
-
@cyber_rookie 这算是一个好习惯吗?
-
这似乎不是一个坏主意,但考虑到您想要实现的目标,这似乎是一个选择,尽管它可能存在一些瓶颈,例如一些重写 HTTP 的防火墙标题。
标签: rest restful-architecture api-design