HTTP Status 202-как предоставить информацию о завершении асинхронного запроса?

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

С HTTP в спецификации (курсив добавлен мной):

202 принято

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

сущность, возвращаемая с этим ответом, должна включите указание текущего состояния запроса и указатель на монитор состояния или некоторая оценка того, когда пользователь может ожидать, что запрос будет выполнен.

вот некоторые мысли:

  • я взглянул на max-age директива, но ее использование было бы злоупотреблением Cache-Control?
  • вернуть ожидаемое время ожидания в теле ответа?
  • добавить конкретное приложение X- заголовок ответа, но X-заголовки устарели в RFC 6648?
  • добавить a (non X-) конкретный заголовок ответа? Если да, то как его следует назвать? Так вопрос пользовательские заголовки HTTP: соглашения об именах дал некоторые идеи, но после устаревания он отвечает только на то, как форматируются заголовки HTTP, а не как их следует называть.
  • другие предложения?

3 ответов


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

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

на другом конце спектра вы можете захотеть пройти весь остальной путь и вернуться 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"
  }
}

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


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

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