Symfony 3.4 - передача файла потока API для загрузки клиента

API отправляет мне поток, содержащий zip-архив нескольких файлов, которые я выбираю, указав их идентификаторы в параметре SelectedIds моего запроса. Я получаю ответ PSR7, который передаю HttpFoundationFactory, чтобы вернуть ответ, соответствующий тому, что должен вернуть контроллер Symfony.

(цель состоит в том, чтобы загрузить ZIP-файл в браузере на стороне клиента.)

Вот содержимое моего метода контроллера

$client  = $this->getApiClient();
$user    = $this->getUser();
$idList  = [51,52,53];
$psr7ApiResponse = $client->post('/v1/get-zip', [
    'headers'     => [
        'Authorization' => sprintf('Bearer %s', $user->getToken()),
    ],
    'http_errors' => false,
    'json'        => [
        'SelectedIds' => $idList,
    ],
]);

$httpFoundationFactory = new HttpFoundationFactory();
return $httpFoundationFactory->createResponse($psr7ApiResponse);

Он отлично работает локально, но на сервере я ничего не получаю, пустая страница. Не могли бы вы знать, в какую сторону мне смотреть, потому что у меня нет журнала ошибок, похоже, что поток пуст, но я не знаю, как это проверить.

Я протестировал API с почтальоном, и все в порядке; мой контроллер также отправляет мне обратно 200


person arno    schedule 26.11.2020    source источник
comment
Вы пытались установить http_errors в true на производстве?   -  person Chris Haas    schedule 30.11.2020
comment
да, ошибок нет все ок :'( но ответ вроде пустой   -  person arno    schedule 01.12.2020
comment
Что внутри $psr7ApiResponse? Он должен содержать код состояния и некоторые заголовки, которые, как мы надеемся, должны содержать больше информации. У вас полностью включены отчеты об ошибках в PHP?   -  person Chris Haas    schedule 01.12.2020
comment
У меня действительно нет ошибок, он работает очень хорошо локально, но не онлайн. Все коды состояния 200. Очень сложно отлаживать. похоже, что содержимое фида не полностью возвращается в мой бэкэнд, когда я передаю его в браузер   -  person arno    schedule 02.12.2020
comment
Существуют ли какие-либо другие функции в том же API, которые не загружают ZIP-файлы (например, простой GET или POST), которые вы можете протестировать на PROD, чтобы определить, связана ли проблема с API в целом или только с этим конкретным процесс? Если первое, также подтвердите, что ваша конечная точка API не имеет ограничений белого списка IP-адресов, которые мешают ей отправлять ответы вашего рабочего сервера. И не могли бы вы опубликовать ответ в течение $psr7ApiResponse, пожалуйста.   -  person rjbathgate    schedule 04.12.2020


Ответы (1)


Выполните следующие шаги, чтобы отладить проблему:

<сильный>1. Проверьте правильность и правильность содержания $psr7ApiResponse

Вы находитесь в другой среде. Возможно, по какой-то причине ваш серверный скрипт не получает правильный ответ. Возможно, аутентификация не работает. Распечатайте полученный отладочный ответ в какой-либо файл журнала с необходимыми подробными сведениями (используйте регистраторы: https://symfony.com/doc/current/logging.html).

Если содержимое или результирующий класс вызова неверны, проблема заключается в связи удаленного вызова, и вы должны отладить это. Скорее всего, это так.

<сильный>2. Проверьте, действительно ли ваш клиент понял ответ, и проверьте правильность ответа

Ваш клиент точно не должен получить пустую страницу (это говорит о том, что проблема 1).

Попробуйте явно вернуть файл, используя Symfony\Component\HttpFoundation\File\File.

Вы также можете установить определенные заголовки ZIP для объекта Response вручную — по крайней мере, для отладки:

    // set example variables
    $filename = "zip-to-download.zip";
    $filepath = "/path"; // maybe save the response to a temp file for debugging purposes
    
    $response = $httpFoundationFactory->createResponse($psr7ApiResponse);
    $response->headers->set('Pragma','public');
    $response->headers->set('Expires',0);
    $response->headers->set('Cache-Control','must-revalidate, post-check=0, pre-check=0');
    $response->headers->set('Content-Description','File Transfer');
    $response->headers->set('Content-type','application/octet-stream');
    $response->headers->set('Content-Disposition','attachment; filename="'.$filename.'"');
    $response->headers->set('Content-Transfer-Encoding','binary');
    return $response;
person Blackbam    schedule 04.12.2020