首页 > 解决方案 > 缺少 http 状态代码 102 的响应标头

问题描述

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

工作流程:

  1. 发布/出口
    • 返回 201 和数据
  2. 获取 /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).

使用的技术:

控制器代码:

 /**
 * 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();
}

预期的请求标头:

编辑

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

我在任何发行说明中都没有发现可能会影响请求答案的内容。

标签: phplaravelapachehttp-status-codesresponse-headers

解决方案


改为使用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

推荐阅读