REST: Отзывчивый интерфейс для медленных операций? - PullRequest
3 голосов
/ 05 декабря 2011

Мне нужна помощь в создании дизайна RESTful для приложения с индикатором выполнения.

Представьте себе приложение, в котором один из ресурсов занимает много времени (1+ минуты) для ответа на HTTP GET (в моем случаеСканирую сеть на устройства).Я бы хотел, чтобы клиенты отображали индикатор выполнения, показывающий, сколько времени займет операция GET, но для того, чтобы это работало, сервер должен предоставить им оценку времени выполнения операции.

Учитывая медленную операцию:

HTTP GET /devices

Что такое RESTful способ дать оценку времени для него?Я не думаю, что могу использовать:

HTTP HEAD /devices

, потому что HEAD должен возвращать те же значения, что и GET минус тело, которое (я думаю) означает, что я 'Мне придется выполнить ту же самую длинную операцию, которую я пытаюсь избежать.Есть идеи?

Ответы [ 2 ]

8 голосов
/ 05 декабря 2011

Если подумать, думаю, я выберу инкрементальный ответ . Согласно RESTful Web Services асинхронные операции лучше всего представлены в терминах HTTP 202.

  1. Клиент отправляет HTTP POST /devices
  2. Сервер отвечает HTTP 202 Accepted. Location: /queues/32194532
  3. Цитирую книгу:

    Сейчас выполняется асинхронная операция, и клиент может сделать GET-запросы к этому URI, чтобы увидеть, как идут дела, то есть получить текущее состояние ресурса «работа». После завершения операции все результаты станут доступны. как представление этого ресурса. Как только клиент закончит чтение результатов, он может УДАЛИТЬ ресурс задания. Клиент может даже быть в состоянии отменить операцию путем УДАЛЕНИЕ своей работы преждевременно.

  4. Цитирование https://stackoverflow.com/a/5081246/14731: Задание должно возвращаться 200 OK, когда запрошенный процесс еще не завершен. Ответ должен содержать описание ожидающего статуса процесса.
  5. Цитирование https://stackoverflow.com/a/5081246/14731: Задание должно возвращаться 201 Created, когда обработка будет завершена. Ответ в случае GET/PUT/POST должен содержать Местоположение запрашиваемого / созданного / обновленного ресурса.
  6. Цитирую книгу:

    Есть одна морщина. Потому что каждый запрос на запуск асинхронной операции делает сервер создает новый ресурс (если только временный), такие запросы не являются безопасными ни идемпотент. Это означает, что вы не можете создавать асинхронные операции с GET, УДАЛИТЬ, или (обычно) PUT. Единственный метод HTTP, который вы можете использовать и при этом уважать единый интерфейс POST.

2 голосов
/ 05 декабря 2011

Может быть, просто создать отдельный ресурс "прогресс"?

GET /progress/foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...