Заголовки ответа отсутствуют с кодом состояния http 102 - PullRequest
0 голосов
/ 14 мая 2018

В настоящее время я разрабатываю REST API, в котором мне нужно вернуть 102 HTTP status code (обработка), пока я генерирую экспорт.

Рабочий процесс:

  1. POST / экспорт
    • возврат 201 с данными
  2. GET / exports / id
    • возвращает 102 с данными, если экспорт обрабатывается
    • возвращает 200 с данными, если экспорт завершен

Когда я пытаюсь получить данные экспорта во времяон обрабатывает, заголовки ответа отсутствуют: заголовки ответа отсутствуют с кодом состояния HTTP 102.Если я, например, поменяю код состояния на 2xx, он работает нормально.Я не могу понять.Есть ли что-то конкретное с кодом состояния HTTP 102?Когда я говорю, что заголовки ответа отсутствуют, я имею в виду: 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();
}

Ожидаемые заголовки запроса:

  • Access-Control-Allow-Origin
  • Cache-Control
  • Соединение
  • Длина содержимого
  • Тип содержимого
  • Дата
  • Proxy-Connection
  • Сервер
  • Варь

РЕДАКТИРОВАТЬ

Я должен был упомянуть, что он работал на моем предыдущемconfig:

  • Ubuntu 17.10 LTS
  • PHP 7.1 (последняя версия)
  • laravel / lumen 5.6.16
  • Apache 2.4.27

В примечаниях к выпуску я не нашел, что могло повлиять на ответ на запрос.

1 Ответ

0 голосов
/ 02 ноября 2018

Используйте 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() неhandle 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
...