Guzzle 5.3:如果大于 ~1MB,则无法 POST JSON body
Guzzle 5.3: Unable to POST JSON body if larger than ~1MB
我正在使用 Guzzle 5.3 通过 Guzzle 服务(通过 https://github.com/ticketevolution/ticketevolution-php)尝试 POST 到 API 端点 JSON body 包含编码为 base64 的 PDF。当 body 小于 ~1MB 时,它工作正常。当 body 较大时,似乎永远不会发送 body。
我已经在使用和不使用 Expect: 100 header 的情况下对其进行了测试,它似乎没有什么不同。
我已经用 Transfer-Encoding 进行了测试:chunked,但是因为 API 需要整个 POST body 才能使用 chunked 进行身份验证。
我们已经测试了客户端和应用程序服务器之间是否存在负载平衡。
根据我们可以判断的一切,body 只是在大于 ~1MB 时才不会发送。
有没有人知道如何让 Guzzle 5.3 发送 body 即使它大于 1MB?
下面是日志输出
[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
运行 遇到同样的问题,一些调试导致在 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,
],
],
]);
倒回先前获取的实际内容流
因为我是从远程服务器获取内容,这个 article by Matt Downling 帮助我发现在将实际流用作 multipart/form-data
请求的一部分之前我需要倒回实际流:
$response->getBody()->seek(0);
我正在使用 Guzzle 5.3 通过 Guzzle 服务(通过 https://github.com/ticketevolution/ticketevolution-php)尝试 POST 到 API 端点 JSON body 包含编码为 base64 的 PDF。当 body 小于 ~1MB 时,它工作正常。当 body 较大时,似乎永远不会发送 body。
我已经在使用和不使用 Expect: 100 header 的情况下对其进行了测试,它似乎没有什么不同。
我已经用 Transfer-Encoding 进行了测试:chunked,但是因为 API 需要整个 POST body 才能使用 chunked 进行身份验证。
我们已经测试了客户端和应用程序服务器之间是否存在负载平衡。
根据我们可以判断的一切,body 只是在大于 ~1MB 时才不会发送。
有没有人知道如何让 Guzzle 5.3 发送 body 即使它大于 1MB?
下面是日志输出
[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
运行 遇到同样的问题,一些调试导致在 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,
],
],
]);
倒回先前获取的实际内容流
因为我是从远程服务器获取内容,这个 article by Matt Downling 帮助我发现在将实际流用作 multipart/form-data
请求的一部分之前我需要倒回实际流:
$response->getBody()->seek(0);