A resposta curta e direta
Como a solicitação fala da execução da lista de tarefas (as tarefas são o recurso de que estamos falando aqui), se o grupo de tarefas foi movido para a execução (ou seja, independentemente do resultado da execução), seria sensato que o status da resposta será 200 OK
. Caso contrário, se houver um problema que impeça a execução do grupo de tarefas, como falha na validação dos objetos da tarefa ou algum serviço necessário não esteja disponível, por exemplo, o status da resposta deverá indicar esse erro. Depois que, quando a execução das tarefas começa, visto que as tarefas a serem executadas estão listadas no corpo da solicitação, eu esperaria que os resultados da execução fossem listados no corpo da resposta.
A resposta longa e filosófica
Você está enfrentando esse dilema porque está se desviando para o que o HTTP foi projetado. Você não está interagindo para gerenciar recursos; pelo contrário, está usando-o como meio de invocação remota de método (o que não é muito estranho, mas funciona mal sem um esquema pré-concebido).
Com o exposto acima, e sem coragem de transformar essa resposta em um longo guia opinativo, a seguir é apresentado um esquema de URI compatível com uma abordagem de gerenciamento de recursos:
/tasks
GET
lista todas as tarefas, paginadas
POST
adiciona uma única tarefa
/tasks/task/[id]
GET
responde com o objeto de estado de uma única tarefa
DELETE
cancela / exclui uma tarefa
/tasks/groups
GET
lista todos os grupos de tarefas, paginados
POST
adiciona um grupo de tarefas
/tasks/groups/group/[id]
GET
responde com o estado de um grupo de tarefas
DELETE
cancela / exclui o grupo de tarefas
Essa estrutura fala sobre recursos, não o que fazer com eles. O que está sendo feito com recursos é a preocupação de outro serviço.
Outro ponto importante a destacar é que é aconselhável não bloquear por muito tempo em um manipulador de solicitações HTTP. Assim como a interface do usuário, uma interface HTTP deve ser responsiva - em uma escala de tempo que é algumas ordens de magnitude mais lenta (porque essa camada lida com E / S).
Tomar a decisão de projetar uma interface HTTP que gerencia estritamente os recursos provavelmente é tão difícil quanto afastar o trabalho de um thread da interface do usuário quando um botão é clicado. Requer que o servidor HTTP se comunique com outros serviços para executar tarefas, em vez de executá-las no manipulador de solicitações. Esta não é uma implementação superficial, é uma mudança de direção.
Alguns exemplos de como esse esquema de URI seria usado
Executando uma única tarefa e acompanhando o progresso:
POST /tasks
com a tarefa de executar
GET /tasks/task/[id]
até que o objeto de resposta completed
tenha um valor positivo enquanto mostra o status / progresso atual
Executando uma única tarefa e aguardando sua conclusão:
POST /tasks
com a tarefa de executar
GET /tasks/task/[id]?awaitCompletion=true
até que completed
tenha valor positivo (provavelmente tem tempo limite, motivo pelo qual isso deve ser repetido)
Executando um grupo de tarefas e acompanhando o progresso:
POST /tasks/groups
com o grupo de tarefas para executar
GET /tasks/groups/group/[groupId]
até que a completed
propriedade do objeto de resposta tenha valor, mostrando o status da tarefa individual (3 tarefas concluídas em 5, por exemplo)
Solicitando uma execução para um grupo de tarefas e aguardando sua conclusão:
POST /tasks/groups
com o grupo de tarefas para executar
GET /tasks/groups/group/[groupId]?awaitCompletion=true
até responder com resultado que indica conclusão (provavelmente tem tempo limite, e é por isso que deve ser feito um loop)