繁体   English   中英

Guzzle 5.3:如果大于~1MB,则无法POST JSON主体

[英]Guzzle 5.3: Unable to POST JSON body if larger than ~1MB

我通过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

运行到同样的问题,一些调试导致最终在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,
        ],
    ],
]);

重绕先前获取的实际内容流

由于我从远程服务器获取内容,Matt Downling撰写的这篇文章帮助我发现在将其用作multipart/form-data请求的一部分之前我需要回滚实际流:

$response->getBody()->seek(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM