RESTful API - фрагментарный ответ для массовой операции
Я работаю над REST-подобным API, который будет поддерживать массовые операции с некоторыми ресурсами. Поскольку выполнение такого запроса может занять некоторое время, я хотел бы вернуть статусы операций в виде фрагментированного ответа. Тип носителя должен быть JSON. Как это сделать с JAX-RS?
(Я знаю, что есть StreamingOutput, но он должен вручную сериализовать данные.)
1 ответ
Кодирование Chunked Transfer обычно используется в тех случаях, когда длина содержимого неизвестна, когда отправитель начинает передачу данных. Получатель может обрабатывать каждый фрагмент, пока сервер все еще производит новые. Это означает, что сервер отправляет все время. Я не думаю, что это имеет слишком много смысла отправлять I'm still working|I'm still working|I'm still working|
в блоках и, насколько я знаю, кодировка передачи chunked прозрачно обрабатывается большинством серверов приложений. Они автоматически переключаются, когда ответ превышает определенный размер.
Общий шаблон для вашего варианта использования выглядит следующим образом:
Клиент запускает массовую операцию:
POST /batch-jobs HTTP/1.1
Сервер создает ресурс, который описывает состояние задания и возвращает URI в заголовке Location:
HTTP/1.1 202 Accepted
Location: /batch-jobs/stats/4711
Клиент проверяет этот ресурс и получает 200:
GET /batch-jobs/stats/4711 HTTP/1.1
В этом примере используется JSON, но вы также можете вернуть обычный текст или добавить кеширующие заголовки, которые сообщают клиенту, как долго он должен ждать следующего опроса.
HTTP/1.1 200 OK
Content-Type: application/json
{ "status" : "running", "nextAttempt" : "3000ms" }
Если работа выполнена, сервер должен ответить 303 и URI ресурса, который он создал:
HTTP/1.1 303 See other
Location: /batch-jobs/4711