Я в настоящее время разрабатываю REST API
в котором мне нужно вернуть 102 HTTP status code
(обработка), пока я генерирую экспорт.
Рабочий процесс:
Когда я пытаюсь извлечь данные экспорта во время их обработки, заголовки ответа отсутствуют: заголовки ответа отсутствуют с кодом состояния 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)
,
Используемые технологии:
Код контроллера:
/**
* 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();
}
Ожидаемые заголовки запроса:
Я должен был упомянуть, что он работал на моем предыдущем конфиге:
Я не нашел ни в каких заметках о выпуске, что могло повлиять на ответ на запрос.
использование 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
Других решений пока нет …