将GuzzleHttp v5升级到v6

时间:2016-03-03 07:47:23

标签: guzzle

以下代码片段适用于GuzzleHttp v5。

$response = $client->post(
    $uri,
    [
        'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
        'body'    => ['Filedata' => fopen($filename, 'r')],
    ]
);

$ filename中指定的文件内容作为变量'Filedata'发送到URI。

上传规范是:

http://yourserver.com/services/create?Filedata=<multipart/form-data encoded file>...

文件必须以'Filedata'的形式发送。如何为GuzzleHttp v6编码?

据我所知,GuzzleHttp v6不允许这样做,但我只是尝试了一两天而且没有时间自己研究它,因为应用程序必须在周一交付。< / p>

有什么想法吗?

我现在将它留作v5,但这只是回避问题。

2 个答案:

答案 0 :(得分:1)

一旦找到答案,当然是显而易见的。以下代码是解决方案:

$response = $client->post(
    $uri,
    [
        'multipart' => [
            [
                'name'     => 'Filedata',
                'contents' => open($filename, 'r'),
            ]
        ],
        'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
    ]
);

感谢Shaun Bramley指出我正确的方向。

答案 1 :(得分:0)

我最初的问题是为您的特定用例提供额外的背景信息。

对于您的特定用例,主要问题是'body'请求选项不再接受数组。参考:如果client::invalidBody()为真,则Client::requestAsync会致电is_array()

最简单的方法是:

$response = $client->post(
    $uri,
    [
        'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
        'form_params'    => ['Filedata' => fopen($filename, 'r')],
    ]
);

默认情况下Guzzle 5.3处理的身体参数作为PostBody作为数组传递。这意味着数组索引和值最终使用http_build_query urlencoded为字符串。

根据您的特定用例(客户端维护其会话的时间长度),您可能还需要考虑使用CookieJar。链接:Using CookiesCookieJar供参考。