Заголовки ответа отсутствуют с http-кодом статуса 102

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

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

  1. ПОСТ / экспорт
    • вернуть 201 с данными
  2. GET / export / id
    • вернуть 102 с данными, если экспорт обрабатывается
    • вернуть 200 с данными, если экспорт завершен

Когда я пытаюсь извлечь данные экспорта во время их обработки, заголовки ответа отсутствуют: заголовки ответа отсутствуют с кодом состояния 102 HTTP. Если я, например, поменяю код состояния на 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 / люмен 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
  • соединение
  • Content-Length
  • Тип содержимого
  • Дата
  • Proxy-Connection
  • сервер
  • изменяться

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

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

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

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

1

Решение

использование 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]