202 Accepted
用法
202 Accepted 状态码充当一种确认:服务器已收到请求并打算处理该提交。在实践中,这意味着服务器已校验请求格式并将该工作放入内部队列。排队的任务通常是长耗时的处理过程,或批处理操作的一部分。
服务器没有机制在之后再发送一个表明最终结果的响应。只要服务器提供了状态端点,客户端就有责任定期进行轮询。
SEO 影响
Googlebot 在遇到 202 响应时会短暂等待内容。在等待期内收到的内容会被传入索引流程,但不保证一定被索引。
一旦收到 200 成功响应,轮询即停止。其他有效结果还包括:201,表示已创建新资源且可在 Location 请求头的 URI 处获取;或 204,表示作业已完成且无内容可返回。
示例
客户端提交定义一个作业的 XML 数据。服务器确认收到该提交。客户端随后发起请求以检查工作是否完成。最终,服务器发出完成信号。
请求
POST /job HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 68
<?xml version="1.0"?>
<job>
<id>125</id>
<task>G01</task>
</job>
响应
HTTP/1.1 202 Accepted
Link: </job/status/125>; rel="http://example.re/job-status"
Content-Length: 0
状态请求 1
GET /job-status/125 HTTP/1.1
Host: example.com
响应
HTTP/1.1 202 Accepted
Content-Length: 0
状态请求 2
GET /job-status/125 HTTP/1.1
Host: example.com
响应
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 18
{"success":"true"}
收到 200 状态码后,客户端停止轮询并处理结果。
202 中的响应体
202 Accepted 响应允许包含消息体。该消息体通常包含请求的当前状态、指向状态监控端点的链接,或操作预计完成时间的估算。与指向已创建资源的 201 不同,202 的消息体描述的是待处理的操作本身。
202 与 201 对比
201 响应确认资源已创建并可立即获取。202 响应确认请求已收到但处理尚未完成。当响应时资源已存在时使用 201。当工作已排队或为异步、且最终结果尚未可知时使用 202。
代码参考
.NET
HttpStatusCode.Accepted
Rust
http::StatusCode::ACCEPTED
Rails
:accepted
Go
http.StatusAccepted
Symfony
Response::HTTP_ACCEPTED
Python3.5+
http.HTTPStatus.ACCEPTED
Java
java.net.HttpURLConnection.HTTP_ACCEPTED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_ACCEPTED
Angular
@angular/common/http/HttpStatusCode.Accepted