HTTP状态202 - 如何提供有关异步请求完成的信息?

时间:2013-02-12 12:50:22

标签: rest http-headers http-status-codes

当服务器为异步请求返回202 - Accepted状态代码时,给出请求完成估计的适当方法是什么?

来自HTTP spec(我添加的斜体):

  

202接受

     

请求已被接受处理,但处理尚未完成。 [...]

     

使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计

以下是一些想法:

  • 我已经浏览了max-age指令,但使用它会滥用Cache-Control
  • 在响应正文中返回预期的等待时间?
  • 添加特定于应用程序的X-响应标头,但RFC 6648中已弃用X-标头?
  • 添加(非X-)特定响应标头?如果是这样,它应该如何命名? SO问题Custom HTTP headers : naming conventions给出了一些想法,但在弃用之后,它只回答了如何格式化HTTP标头,而不是如何命名它们。
  • 其他建议?

3 个答案:

答案 0 :(得分:10)

绝对不要滥用现有的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"
  }
}

答案 1 :(得分:9)

您可以使用Location标头指定状态监视器的URL。诸如当前状态和估计之类的事情可以放在自定义标题中(除了您自己的软件之外不会使用),或者放在响应主体中(至少是Web浏览器会向用户显示)。

答案 2 :(得分:5)

虽然没有明确提及202 - Accepted响应代码,但Retry-After标头似乎是一个合适的选项。来自documentation

  

可以使用Retry-After响应标头字段来指示服务预计对请求客户端不可用的时间。