php - HTTP 状态代码 102 缺少响应 header

标签 php laravel apache http-status-codes response-headers

我目前正在开发一个 REST API,在生成导出时我需要在其中返回一个 102 HTTP 状态代码(处理)。

工作流程:

  1. POST/导出
    • 返回 201 数据
  2. 获取/导出/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/

相关文章:

mysql - 列表框 Laravel 数据

laravel - FullCalendar - 删除事件中的点

apache - 看起来我可以在 mod_proxy 中比 mod_cluster 做更多?

java - tomcat通过进程ID关闭(windows)

php - codeigniter:使用 htaccess 保护 Controller

php - 使用 docker 在 CentO 上设置 PHP-FPM、Nginx、Mariadb

php - 搜索结果格式

css - 在 Laravel 4 中加载响应式 CSS

apache - 如何计算 Apache SOLR 中 PER DOCUMENT 一词的每次出现次数?

php - 在 Microsoft Azure 网站中启用 mongo PHP 扩展