将 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 为我指明了正确的方向。
以下代码片段适用于 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 为我指明了正确的方向。