我正在设计一组类似于“工作”的RESTful API。一个工作的模型看起来像这样:
Job: {
id: 1,
name: "Brew coffee",
status: "paused" | "running" | "finished",
progress: 0.75
}
按照RESTful原则,客户端通过HTTP动词在/api/jobs
上进行CRUD操作。例如,初始化一个新的作业:
POST /api/jobs
--------------
Request body: {
name: "Push button"
}
---------------
Response status: 200 OK
Response body: {
id: 2,
name: "Cook dinner",
status: "running",
progress: 0
}
访问此工作的方法是
GET /api/jobs/2
--------------
Request body: {}
---------------
Response status: 200 OK
Response body: {
id: 2,
name: "Cook dinner",
status: "running",
progress: 0.5
}
我的问题是,如何为“暂停”这样的操作设计API?我考虑了两个选项:
一种选项是将其设计为PATCH
请求,并直接声明我想要的最终状态,如下所示:
PATCH /api/jobs/2
--------------
Request body: {
status: "paused"
}
---------------
Response status: 200 OK
Response body: {
id: 2,
name: "Cook dinner",
status: "paused",
progress: 0.65
}
另一种选择是将其设计为一个
POST
请求,并声明我想要的action,如下所示。POST /api/jobs/2
--------------
Request body: {
action: "pause"
}
---------------
Response status: 200 OK
Response body: {
// same as above
}
考虑到以后可能会实现其他操作,比如“恢复”、“优先级”,“降低优先级”等,你认为下面两个选项哪个更好?或者还有更好的方法吗?