Guzzle 5.3: невозможно отправить тело JSON, если его размер превышает ~ 1 МБ

Я использую Guzzle 5.3 через Guzzle Services (через https://github.com/ticketevolution/ticketevolution-php), чтобы попытаться выполнить POST в конечную точку API с телом JSON, которое включает PDF-файл, закодированный как base64. Когда тело меньше ~ 1 МБ, все работает нормально. Когда тело больше, кажется, что тело никогда не отправляется.

Я тестировал это с заголовком Expect: 100 и без него, и, похоже, это не имеет значения.

Я тестировал с Transfer-Encoding: chunked, но поскольку API требуется все тело POST для аутентификации с использованием chunked, это не работает.

Мы протестировали с балансировкой нагрузки между клиентом и серверами приложений и без нее.

Из всего, что мы можем сказать, тело просто не отправляется, когда оно больше ~ 1 МБ.

У кого-нибудь есть идеи, как заставить Guzzle 5.3 отправлять тело, даже если оно больше 1 МБ?

Ниже приведен вывод журнала

[2015-09-01 16:15:43] TEvoAPIClientLogger.CRITICAL: 
>>>>>>>> 
POST /v9/orders/2100732/deliver_etickets HTTP/1.1 
Host: api.ticketevolution.com 
User-Agent: ticketevolution-php/3.0.0dev Guzzle/5.3.0 curl/7.44.0 PHP/5.5.28 
Content-Type: application/json 
Content-Length: 1387036 
X-Token: b47dsd8c0ab80a1e2bc24sc341415a2f 
X-Signature: SwBOkdUOqG3SDtjVwi2etosdP+gppwuV5dCq8yMw9lM=  


{"etickets":[{"item_id":1513651,"eticket":"JVBERi0xLjQKJeLjz9MKNCAwIG9iaiBbXQplb… [a whole lot of base64 snipped] …NwolJUVPRgo="}]}
<<<<<<<<  -------- 
cURL error 52: Empty reply from server

person JCobb    schedule 02.09.2015    source источник


Ответы (1)


Столкнувшись с той же проблемой, небольшая отладка привела к тому, что на GuzzleHttp\Ring\Client\CurlFactory::applyBody(), а затем это решило проблему для меня:

Установка конфигурации по умолчанию на клиенте

$client = new \GuzzleHttp\Client([
    'defaults' => [
        'config' => [
            'curl' => [
                'body_as_string' => true,
            ],
        ],
    ],
]);

Установка конфигурации при выдаче запроса

$client->post('https://example.com', [
    'json' => $json,
    'config' => [
        'curl' => [
            'body_as_string' => true,
        ],
    ],
]);

Перемотка ранее извлеченного фактического потока контента

Поскольку я получаю контент с удаленного сервера, этот Статья Мэтта Даунлинга помогла мне узнать, что мне нужно перемотать фактический поток, прежде чем использовать его как часть запроса multipart/form-data:

$response->getBody()->seek(0);
person localheinz    schedule 15.12.2015
comment
Я забыл ответить на свой вопрос, когда решал его, но перемотка исправила это для меня. Я не знал об исправлении body_as_string и не пробовал его. - person JCobb; 16.12.2015