В REST API, если у меня есть ресурс, создание которого может занять значительное время, я мог бы вернуть временный ресурс с кодом состояния 202. Затем клиент мог бы опрашивать этот временный ресурс до тех пор, пока не будет создан фактический ресурс, и перенаправить на него, когда это будет сделано. (с кодом статуса 303). Что-то вроде описанного в http://restcookbook.com/Resources/asynchroneous-operations/.

Есть ли какой-либо стандартизированный способ создания таких ресурсов в OData?

1
Andrei Visnakovs 10 Дек 2018 в 14:18

1 ответ

Лучший ответ

Асинхронные запросы (кратко) упоминаются в Спецификация OData V4. Возможно, стоит прочитать подробности, но вкратце:

Клиент делает запрос, который включает заголовок Prefer: respond-async. Затем сервер может ответить ответом HTTP 202, как вы описали. Этот ответ включает заголовок Location, который указывает на «ресурс монитора состояния».

Когда клиент отправляет запрос к ресурсу монитора состояния, есть 3 основных ответа:

  1. HTTP 202: операция еще не завершена.
  2. HTTP 200: операция завершена. Этот ответ также должен включать заголовок AsyncResult, который содержит код состояния операции (например, 200 для успеха, 5xx для ошибки и т. Д.). В теле ответа содержится результат операции.
  3. HTTP 404:
    • Операция не существует.
    • Операция отменена.
    • Операция могла существовать, но клиент слишком долго ждал, прежде чем запросить статус (также может быть HTTP 410 (Gone)).

Я не знаю ни одного фреймворка, который реализует это поведение, поэтому вам, вероятно, придется программировать его самостоятельно.

3
GWigWam 11 Дек 2018 в 09:36