我目前正在开发REST API
,我需要在生成导出时返回102 HTTP status code
(处理)。
工作流程:
当我尝试在处理时检索导出数据时,没有响应标头:102 HTTP状态代码缺少响应标头。例如,如果我用2xx更改状态代码,它可以正常工作。我无法弄明白。 102 HTTP状态代码有什么特定的吗?当我说响应标题丢失时,我的意思是:Chrome > Developer tools > Network Tab > Click on request > Headers tab > Only showing "General" and "Request Headers" (same with FF & Postman)
。
二手技术:
控制器代码:
/**
* Return export by id
*
* @param int $id
* @return \Illuminate\Http\JsonResponse
*
* @throws AuthorizationException
* @throws ModelNotFoundException
*/
public function getItem(int $id)
{
if($export = Export::find($id))
{
$this->authorize(__FUNCTION__, $export);
if($export->status != Export::STATUS_COMPLETED)
{
return response()->json($export, 102);
}
return response()->json($export);
}
throw new ModelNotFoundException();
}
预期请求标头:
我应该提到它适用于我以前的配置:
我在任何发行说明中都找不到可能影响请求答案的内容。
答案 0 :(得分:0)
改为使用HTTP 202 Accepted
。
请参阅:https://softwareengineering.stackexchange.com/questions/316208/http-status-code-for-still-processing
说明:
RFC 2518说“服务器必须在请求完成后发送最终响应”,这意味着您的服务器还需要向初始请求发送 最终响应代码。 HTTP 102
。不这样做会为等待最终响应但没有得到响应的客户造成超时问题。 Firefox将阻塞,Chrome将超时并将其转换为HTTP 200 OK
。 cURL将通知您有未读内容。
因此,HTTP 102 Processing
仅作为向客户的提示,“好吧,但这可能要花一分钟...”,然后再跟进最终代码和响应正文。
如果要定期轮询它是一个运行时间较长的过程,请使用HTTP 202 Accepted
并关闭响应。
还值得注意的是http_response_code()
无法处理HTTP 102
。
错误的示例:
<?php header('HTTP/1.1 102 Processing'); exit; ?>
很好的例子:
<?php
header('HTTP/1.1 102 Processing'); // let client know it might take a while
sleep(2); // do stuff that takes a while
header('HTTP/1.1 200 OK'); // counterintuitive, but works