我通过Guzzle服务(通过https://github.com/ticketevolution/ticketevolution-php)使用Guzzle 5.3尝试使用包含编码为base64的PDF的JSON正文POST到API端点。当身体小于~1MB时,它可以正常工作。当身体变大时,身体似乎永远不会被送去。
我在使用和不使用Expect:100标题的情况下对此进行了测试,但似乎没有任何区别。
我已经使用Transfer-Encoding进行了测试:chunked,但是因为API需要整个POST主体以便使用chunked进行身份验证不起作用。
我们测试了客户端和应用服务器之间是否有负载平衡。
我们可以告诉身体在大于1MB的情况下不会被发送。
有没有人有任何关于如何让Guzzle 5.3发送身体的想法,即使它大于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
答案 0 :(得分:3)
遇到同样的问题,一些调试结果导致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);