La respuesta corta y directa
Dado que la solicitud habla de ejecutar la lista de tareas (las tareas son el recurso del que estamos hablando aquí), entonces, si el grupo de tareas se ha adelantado a la ejecución (es decir, independientemente del resultado de la ejecución), sería sensato que el estado de respuesta será 200 OK. De lo contrario, si hubiera un problema que impidiera la ejecución del grupo de tareas, como una falla en la validación de los objetos de la tarea , o algún servicio requerido no está disponible, por ejemplo, el estado de respuesta debería indicar ese error. Después de eso, cuando comienza la ejecución de las tareas, ya que las tareas a realizar se enumeran en el cuerpo de la solicitud, entonces esperaría que los resultados de la ejecución se enumeren en el cuerpo de la respuesta.
La respuesta larga y filosófica.
Experimenta este dilema porque se está desviando de lo que HTTP fue diseñado para. No lo está interactuando para administrar recursos, más bien, lo está utilizando como medio de invocación de método remoto (lo cual no es muy extraño, pero funciona mal sin un esquema preconcebido).
Dicho lo anterior, y sin valor para convertir esta respuesta en una guía larga y obstinada, el siguiente es un esquema de URI que se ajusta a un enfoque de gestión de recursos:
/tasks
GET enumera todas las tareas, paginado
POST agrega una sola tarea
/tasks/task/[id]
GET responde con un objeto de estado de una sola tarea
DELETE cancela / elimina una tarea
/tasks/groups
GET enumera todos los grupos de tareas, paginados
POST agrega un grupo de tareas
/tasks/groups/group/[id]
GET responde con el estado de un grupo de tareas
DELETE cancela / elimina el grupo de tareas
Esta estructura habla de recursos, no de qué hacer con ellos. Lo que se está haciendo con los recursos es la preocupación de otro servicio.
Otro punto importante es que es aconsejable no bloquear durante mucho tiempo en un controlador de solicitudes HTTP. Al igual que la interfaz de usuario, una interfaz HTTP debería responder, en una escala de tiempo que es un poco más lenta (porque esta capa se ocupa de IO).
Hacer el movimiento hacia el diseño de una interfaz HTTP que administre estrictamente los recursos es probablemente tan difícil como alejar el trabajo de un hilo de la interfaz de usuario cuando se hace clic en un botón. Requiere que el servidor HTTP se comunique con otros servicios para ejecutar tareas en lugar de ejecutarlas en el controlador de solicitudes. Esta no es una implementación superficial, es un cambio de dirección.
Algunos ejemplos de cómo se usaría dicho esquema URI
Ejecutar una sola tarea y seguir el progreso:
POST /tasks con la tarea a ejecutar
GET /tasks/task/[id]hasta que el objeto de respuesta completedtenga un valor positivo mientras muestra el estado / progreso actual
Ejecutando una sola tarea y esperando su finalización:
POST /tasks con la tarea a ejecutar
GET /tasks/task/[id]?awaitCompletion=truehasta que completedtenga un valor positivo (es probable que tenga un tiempo de espera, por lo que esto debería repetirse)
Ejecutar un grupo de tareas y seguir el progreso:
POST /tasks/groups con el grupo de tareas a ejecutar
GET /tasks/groups/group/[groupId]hasta que la completedpropiedad del objeto de respuesta tenga valor, mostrando el estado de la tarea individual (3 tareas completadas de 5, por ejemplo)
Solicitar una ejecución para un grupo de tareas y esperar su finalización:
POST /tasks/groups con el grupo de tareas a ejecutar
GET /tasks/groups/group/[groupId]?awaitCompletion=true hasta que responda con un resultado que denote la finalización (es probable que tenga tiempo de espera, por lo que debe colocarse en bucle)