我目前正在开发一个 REST API
,在生成导出时我需要在其中返回一个 102 HTTP 状态代码
(处理)。
工作流程:
- POST/导出
- 返回 201 数据
- 获取/导出/id
- 如果正在处理导出,则返回 102 和数据
- 导出完成返回200和数据
当我尝试在处理过程中检索导出数据时,没有响应 header :响应 header 丢失,并显示 102 HTTP 状态代码。例如,如果我用 2xx 更改状态代码,它工作正常。我想不通。 102 HTTP 状态代码有什么特别之处吗?当我说缺少响应 header 时,我的意思是:Chrome > 开发人员工具 > 网络选项卡 > 单击请求 > header 选项卡 > 仅显示“常规”和“请求 header ”(与 FF 和 Postman 相同)
。
使用的技术:
- Ubuntu 18.04 LTS
- PHP 7.2(最新版本)
- laravel/流明 5.6.21
- Apache 2.4.29
Controller 代码:
/**
* 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();
}
预期的请求 header :
- 访问控制允许来源
- 缓存控制
- 连接
- 内容长度
- 内容类型
- 日期
- 代理连接
- 服务器
- 变化
编辑
我应该提到它适用于我以前的配置:
- Ubuntu 17.10 LTS
- PHP 7.1(最新版本)
- laravel/流明 5.6.16
- Apache 2.4.27
我没有在任何发行说明中找到可能影响请求答复的内容。
最佳答案
改用 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
关于php - HTTP 状态代码 102 缺少响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50325695/