REST API任务(非CRUD)的最佳实践
我正在实现一个RESTAPI,并希望输入不严格符合CRUD模型的方法。以下是一个通用示例: 我将一个“狗”对象发布到我的“狗”收藏中。 我给这只新狗(狗/1)贴了一个项圈。 我现在想让狗滚过去 假设“翻滚”是一次性任务,不会改变狗的状态,您将如何实现这一点?我有以下想法: 备选案文1:REST API任务(非CRUD)的最佳实践,api,rest,crud,Api,Rest,Crud,我正在实现一个RESTAPI,并希望输入不严格符合CRUD模型的方法。以下是一个通用示例: 我将一个“狗”对象发布到我的“狗”收藏中。 我给这只新狗(狗/1)贴了一个项圈。 我现在想让狗滚过去 假设“翻滚”是一次性任务,不会改变狗的状态,您将如何实现这一点?我有以下想法: 备选案文1: POST dogs/1 { task: "roll over" } 备选案文2: POST tasks/ { task: "roll over" id: 1
POST dogs/1
{
task: "roll over"
}
备选案文2:
POST tasks/
{
task: "roll over"
id: 1
}
备选案文3:
GET dogs/1/rollOver
假设“翻滚”是一次性任务,不会改变狗的状态,您将如何实现这一点
简短答复:
POST /tasks
{
"task": "roll over",
"id": "/dogs/1"
}
更详细的回答:REST的一个重要约束是统一接口,它包括这样一个事实:对于任何地方的所有资源,自描述消息的语义都是相同的
GET
是一种糟糕的“启动任务”的方式,因为GET的语义是有效的只读的,这意味着任何地方的任何人都可以随时请求该资源的表示。考虑一下浏览器预先获取任务链接以节省时间,或者使用web爬虫添加任务资源以编制索引
这就留下了一个选择
POST /dogs/1
POST /tasks
现在,由于POST是一种不安全的方法,有一个有趣的缓存皱纹需要考虑。对不安全请求的无错误响应将使用目标资源的缓存表示
通常,如果您正在对资源进行更改(例如:PUT/foo),这正是您想要的 但是在这里,听起来“翻滚”任务不应该改变/dogs/1
的表示形式。如果该资源的表示形式不会改变,那么我不想使其无效,而是将请求指向其他资源
当然,拼写/tasks
并没有什么特别神奇的地方。它也可以是/dogs/1/tasks
,或者/tasks/dogs/1
或者/dogs/1/rollOver
或者/b79d1e50-44eb-4c51-bfc6-ef0d94c15fdc