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
Другие вопросы по тегам