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

mat*_*sev 19 rest http-status-codes http-headers

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

HTTP规范(我添加的斜体):

202接受

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

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

以下是一些想法:

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

Jon*_*Jon 11

绝对不要滥用现有的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"
  }
}
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 10

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


mat*_*sev 5

虽然没有明确提到202 - Accepted响应代码,但Retry-After标题似乎是一个合适的选项.从文档:

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

  • 根据文档和用例,“Retry-After”只能与“503”、“429”和“301”一起使用。不建议用于“202”。https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After RFC https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html 提到:“随此响应返回的实体应该包括请求当前状态的指示以及指向状态监视器的指针或用户期望请求何时得到满足的一些估计。” (4认同)