Подтвердить что ты не робот

HTTP Status 202 - как предоставить информацию об окончании запроса async?

Каков подходящий способ дать оценку завершения запроса, когда сервер вернет код состояния 202 - Accepted для асинхронных запросов?

Из HTTP-спецификация (курсив, добавленный мной):

202 Принято

Запрос принят для обработки, но обработка еще не завершена. [...]

Объект, возвращенный с этим ответом, ДОЛЖЕН включать указание текущего состояния запроса и указатель на монитор состояния или некоторую оценку того, когда пользователь может ожидать выполнения запроса.

Вот несколько мыслей:

  • Я взглянул на директиву max-age, но использование этого было бы злоупотреблением Cache-Control?
  • Возвращает ожидаемое время ожидания в теле ответа?
  • Добавьте специальный ответный ответ X-, но заголовки X- устарели в RFC 6648?
  • Добавить (не X-) конкретный заголовок ответа? Если да, то как его назвать? Вопрос SO Пользовательские заголовки HTTP: соглашения об именах дали некоторые идеи, но после устаревания он отвечает только на то, как отформатированы заголовки HTTP, а не как их следует назвать.
  • Другие предложения?
4b9b3361

Ответ 1

Хотя явно не указано специально для кода ответа 202 - Accepted, заголовок Retry-After кажется подходящим вариантом. Из документа :

Поле заголовка ответа Retry-After можно использовать [...], чтобы указать, как долго служба будет недоступна запрашивающему клиенту.

Ответ 2

Вы можете использовать заголовок Location, чтобы указать URL-адрес монитора состояния. Такие вещи, как текущее состояние и оценка, могут идти в пользовательских заголовках (которые не могут использоваться ни одним, кроме вашего собственного программного обеспечения), либо в теле ответа (который веб-браузер будет отображаться для пользователя, по крайней мере).

Ответ 3

Определенно не злоупотребляйте существующими заголовками HTTP для этого. Поскольку это ваш собственный сервер, вы можете определить, как выглядит ответ. Вы можете (и должны) выбирать любой ответ, который лучше всего подходит для предполагаемого получателя этой информации и возвращать фактическую информацию в тело ответа.

Например, если вы заинтересованы только в отображении читаемого человеком сообщения, вы можете вернуть text/plain сообщение "Ваш запрос, скорее всего, будет обработан в течение следующих 30 минут".

На другом конце спектра вы можете пройти весь путь REST и вернуть application/json, возможно, отформатированный таким образом (я полностью сделал это на месте):

{
  "status": "pending",
  "completion": {
    "estimate": "Thu Sep 08 2011 12:00:00 GMT-0400",
    "rejected-after": "Fri Sep 09 2011 12:00:00 GMT-0400",
  },
  "tracking": {
    "url": "http://server/status?id=myUniqueId"
  }
}