简短直接的答案
由于请求涉及执行任务列表(任务是我们在此处所说的资源),因此,如果任务组已移至执行(也就是说,无论执行结果如何),那将是明智的响应状态将为200 OK
。否则,如果存在阻止任务组执行的问题(例如,任务对象的验证失败),或者例如某些必需的服务不可用,则响应状态应表示该错误。除此之外,当开始执行任务时,看到要执行的任务在请求正文中列出,那么我希望执行结果将在响应正文中列出。
漫长而哲学的答案
您正在经历这个难题,因为您偏离了HTTP的设计宗旨。您不是在与它进行交互来管理资源,而是在将它用作远程方法调用的方式(这不是很奇怪,但是如果没有先入为主的方案,效果会很差)。
鉴于以上所述,并且没有勇气将这个答案转变为冗长的指南,以下是符合资源管理方法的URI方案:
/tasks
GET
列出所有任务,分页
POST
添加一个任务
/tasks/task/[id]
GET
用单个任务的状态对象响应
DELETE
取消/删除任务
/tasks/groups
GET
列出所有任务组,分页
POST
添加一组任务
/tasks/groups/group/[id]
GET
响应任务组的状态
DELETE
取消/删除任务组
该结构只讨论资源,而不是处理资源。资源正在做的事情是另一项服务的关注。
需要注意的另一个重要点是,建议不要在HTTP请求处理程序中长时间阻塞。就像UI一样,HTTP接口应该具有响应能力-在时间尺度上要慢几个数量级(因为该层处理IO)。
转向设计严格管理资源的HTTP接口可能与单击按钮时将工作移出UI线程一样困难。它要求HTTP服务器与其他服务通信以执行任务,而不是在请求处理程序中执行任务。这不是一个简单的实现,而是方向的改变。
如何使用这种URI方案的一些示例
执行单个任务并跟踪进度:
POST /tasks
与执行任务
GET /tasks/task/[id]
直到响应对象completed
在显示当前状态/进度时具有正值
执行单个任务并等待其完成:
POST /tasks
与执行任务
GET /tasks/task/[id]?awaitCompletion=true
直到completed
具有正值(可能有超时,这就是为什么要循环)
执行任务组并跟踪进度:
POST /tasks/groups
与要执行的任务组
GET /tasks/groups/group/[groupId]
直到响应对象completed
属性具有值(显示单个任务状态)为止(例如,完成5个任务中的3个)
请求执行任务组并等待其完成:
POST /tasks/groups
与要执行的任务组
GET /tasks/groups/group/[groupId]?awaitCompletion=true
直到响应表示完成的结果(可能有超时,这就是为什么要循环)