http状态代码102缺少响应标头

时间:2018-05-14 08:09:13

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

我目前正在开发REST API,我需要在生成导出时返回102 HTTP status code(处理)。

工作流程:

  1. POST / exports
    • 使用数据返回201
  2. GET / exports / id
    • 如果导出正在处理,则返回102包含数据
    • 如果导出完成,则返回带有数据的200
  3. 当我尝试在处理时检索导出数据时,没有响应标头: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 / lumen 5.6.21
    • Apache 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();
    }
    

    预期请求标头:

    • 访问控制允许来源
    • 缓存控制
    • 连接
    • 的Content-Length
    • 内容类型
    • 日期
    • - 代理连接
    • 服务器
    • 因人而异

    修改

    我应该提到它适用于我以前的配置:

    • Ubuntu 17.10 LTS
    • PHP 7.1(最新版本)
    • laravel / lumen 5.6.16
    • Apache 2.4.27

    我在任何发行说明中都找不到可能影响请求答案的内容。

1 个答案:

答案 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