将 GuzzleHttp v5 升级到 v6

Upgrading GuzzleHttp v5 to v6

以下代码片段适用于 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 不允许这样做,但我只尝试了一两天并且没有更多时间自己研究它,因为应用程序必须在星期一交付.

有什么想法吗?

我暂时将其保留为 v5,但这只是回避问题。

我最初的问题是为您的特定用例提供额外的上下文。

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

最简单的方法应该如下:

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

默认情况下,Guzzle 5.3 处理作为 PostBody 作为数组传入的正文参数。这意味着数组索引和值最终使用 http_build_query.

被编码为字符串

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

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

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

感谢 Shaun Bramley 为我指明了正确的方向。