我正在实现一个REST API,它涉及在服务器上创建一个对象 . 对象创建涉及多个步骤,可能需要一段时间 . 我不希望用户等待它 . 我只返回202响应,其中包含客户端请求的唯一请求ID,并在服务器上启动一些线程来创建对象 . 客户端应该在将来检查请求是否完成 . 流程如下:
-
客户端POST对象 .
-
服务器以202 Accepted代码响应,并带有Location头
/my-app/<reqId>
-
客户端在
/my-app/<reqId>
上进行了GET
现在,在第三步,这些事情可能会发生:
-
对象创建仍在进行中(客户端应该在一段时间后再次检查) .
-
发生了一些错误 .
-
对象已成功创建 .
现在,对于上述三种情况,我的API /my-app/<reqId>
应该响应哪些http代码?
1 回答
我可能会从一开始就有点不同 .
Location
标头有specific meaning,指向连接到请求的实际资源,基本上是请求的所有内容,而不是指示请求本身状态的资源 . 这可能是一个小差异,但可能会在以后混淆 .规范says
202
也应该返回指示或链接到"state"资源的内容,该资源描述了请求本身的进度 .所以流程可能是:
客户端
POST
服务器发送
202 Accepted
.Location
标头指向所请求资源所在的URI(这不是状态),这将是404
,直到处理完成 . 此外,202
的内容可能包含"state"表示 .Content-Location
标头包含指向此"state"资源的链接 .Client
GET
是检查进度的状态资源 . 此资源始终存在,因此始终返回200
.如果状态指示成功,则
Location
中指示的资源现在存在,否则它将永远不存在 . 国家资源继续无限期存在 .