Короткий прямой ответ
Поскольку запрос говорит о выполнении списка задач (задачи - это ресурс, о котором мы здесь говорим), то если группа задач была перенесена на выполнение (то есть независимо от результата выполнения), то это было бы разумно что статус ответа будет 200 OK
. В противном случае, если возникла проблема, которая помешала бы выполнению группы задач, например, не удалось проверить объекты задачи , или какая-либо необходимая служба, например, недоступна, то статус ответа должен обозначать эту ошибку. В прошлом, когда начинается выполнение задач, учитывая, что задачи для выполнения перечислены в теле запроса, я бы ожидал, что результаты выполнения будут перечислены в теле ответа.
Длинный философский ответ
Вы столкнулись с этой дилеммой, потому что вы отклоняетесь от того, для чего был разработан HTTP. Вы не взаимодействуете с ним для управления ресурсами, скорее вы используете его как средство удаленного вызова метода (что не очень странно, но плохо работает без заранее заданной схемы).
С учетом вышесказанного и без смелости превратить этот ответ в подробное руководство, ниже приводится схема URI, которая соответствует подходу управления ресурсами:
/tasks
GET
перечисляет все задачи, разбитые на страницы
POST
добавляет одну задачу
/tasks/task/[id]
GET
отвечает объектом состояния одной задачи
DELETE
отменяет / удаляет задачу
/tasks/groups
GET
перечисляет все группы задач, разбитые на страницы
POST
добавляет группу задач
/tasks/groups/group/[id]
GET
отвечает с состоянием целевой группы
DELETE
отменяет / удаляет группу задач
Эта структура говорит о ресурсах, а не о том, что с ними делать. То, что делается с ресурсами, является заботой другой службы.
Еще один важный момент: желательно, чтобы блок обработчика HTTP-запросов не блокировался слишком долго. Как и в случае с пользовательским интерфейсом, интерфейс HTTP должен быть отзывчивым - в масштабе времени, который на несколько порядков медленнее (потому что этот уровень имеет дело с IO).
Переход к разработке HTTP-интерфейса, который строго управляет ресурсами, вероятно, столь же труден, как и перемещение кнопки из потока пользовательского интерфейса при нажатии кнопки. Требуется, чтобы 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
свойство объекта ответа не будет иметь значение, показывая статус отдельной задачи (например, 3 задачи выполнены из 5)
Запрос выполнения для группы задач и ожидание его завершения:
POST /tasks/groups
с группой задач для выполнения
GET /tasks/groups/group/[groupId]?awaitCompletion=true
пока не ответит с результатом, который обозначает завершение (вероятно, имеет тайм-аут, поэтому должен быть зациклен)