php - 缺少 http 状态代码 102 的响应标头
问题描述
我目前正在开发一个,我需要在生成导出时REST API
返回一个(处理)。102 HTTP status code
工作流程:
- 发布/出口
- 返回 201 和数据
- 获取 /exports/id
- 如果正在处理导出,则返回 102 和数据
- 如果导出完成返回 200 和数据
当我在处理过程中尝试检索导出数据时,没有响应标头:缺少响应标头和 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)
.
使用的技术:
- Ubuntu 18.04 LTS
- PHP 7.2(最新版本)
- laravel/流明 5.6.21
- 阿帕奇 2.4.29
控制器代码:
/**
* 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();
}
预期的请求标头:
- 访问控制允许来源
- 缓存控制
- 联系
- 内容长度
- 内容类型
- 日期
- 代理连接
- 服务器
- 各不相同
编辑
我应该提到它适用于我以前的配置:
- Ubuntu 17.10 LTS
- PHP 7.1(最新版本)
- laravel/流明 5.6.16
- 阿帕奇 2.4.27
我在任何发行说明中都没有发现可能会影响请求答案的内容。
解决方案
改为使用HTTP 202 Accepted
。
解释:
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
推荐阅读
- polymer - Polymer 3.0.5 - “DOMException:无法在‘CustomElementRegistry’上执行‘define’”
- php - CakePhp 2.5 $belongsTo 两种型号
- java - GSON JSON 解析字符串与 POJO
- hadoop - 错误 hive.HiveConfig:无法加载 org.apache.hadoop.hive.conf.HiveConf。确保 HIVE_CONF _DIR 设置正确
- javascript - ReferenceError:答案未在 HTMLButtonElement.button.onclick 中定义
- swift - 无法在 Swift 中进行领域迁移
- python - 如何使用 SQLalchemy 将时间序列数据插入 SQLite?
- node.js - MongoDB 注入:转义用户输入以与 $where 运算符一起使用
- reactjs - 意外的令牌,在我的 countText 案例中应为“}”
- git - GitLab CI/CD:仅在特定目录中的文件发生更改时运行作业