Guzzle 在多部分请求中发送空数组
Guzzle send empty array in multipart request
我正在使用 Guzzle 6 to send a multipart form request to a 3rd party api(cloud Foundry). the api takes 2 parameters "resources" and "application". here 是我正在拨打的电话的文档。简而言之,这会将二进制文件部署到应用程序服务器。下面是我在 Guzzle 中使用的代码。尝试发送一个空数组作为 "resource" 参数的内容时出现 "invalid resource type" 错误。 Guzzle 似乎只允许在这里使用字符串? api 要求在推送新二进制文件时发送一个空数组。
代码如下:
$response = $this->client->put($this->baseUrl . "apps/7887990-654e-4516-8ce9-b37bc2f93a87/bits", [
'multipart' => [
[
'name' => 'resources',
'contents' => []
],
[
'name' => 'application',
'contents' => '@/tmp/cfdownloadYQfOp7',
]
]
]);
上述操作因上述错误而失败,将 ti 更改为字符串会导致对 api 的错误请求。
这里是可以正常工作的 curl 命令:
curl -k -X PUT -H "Authorization:token here" -F 'resources=[]' -F "application=@/tmp/cfdownloadF9AxlE" https://api.cloudfoundry.com/v2/apps/2d0f491b-d8dd-4b3a-96f9-58b3678e5dad/bits
有谁知道如何使用上面的 guzzle 代码让它工作?
我已经解决了这个问题。事实证明这不是发送数组的问题,而是 guzzle 抛出的另一个错误掩盖了真正的问题。
首先我将 guzzle 设置为调试,并关闭异常(见下文)。 Guzzle 如果未关闭,将屏蔽来自第三方的实际异常。我得到了 400 个正确的错误响应,但它隐藏了实际消息,即我试图发送的文件无法解压缩。然后我决定更改多部分请求以使用 guzzle 文档中的 'fopen' 选项,而不是使用 cloudfoundry 文档中的“@”。这解决了问题,现在一切正常。请参阅下面的更新请求。
new Client(['debug'=>true,'exceptions'=>false,'headers' => ['Authorization' => "Bearer " . $token, "Accept" => "application/json"], 'verify' => false])
guzzle 请求:
$response = $this->client->put($this->baseUrl . "apps/cb44bb975-654e-4516-8ce9-b37bc2f93a87/bits", [
'multipart' => [
[
'name' => 'resources',
'contents' => '[]'
],
[
'name' => 'application',
'contents' => fopen('/tmp/cfdownloadYQfOp7', 'r')
]
]
]);
我正在使用 Guzzle 6 to send a multipart form request to a 3rd party api(cloud Foundry). the api takes 2 parameters "resources" and "application". here 是我正在拨打的电话的文档。简而言之,这会将二进制文件部署到应用程序服务器。下面是我在 Guzzle 中使用的代码。尝试发送一个空数组作为 "resource" 参数的内容时出现 "invalid resource type" 错误。 Guzzle 似乎只允许在这里使用字符串? api 要求在推送新二进制文件时发送一个空数组。
代码如下:
$response = $this->client->put($this->baseUrl . "apps/7887990-654e-4516-8ce9-b37bc2f93a87/bits", [
'multipart' => [
[
'name' => 'resources',
'contents' => []
],
[
'name' => 'application',
'contents' => '@/tmp/cfdownloadYQfOp7',
]
]
]);
上述操作因上述错误而失败,将 ti 更改为字符串会导致对 api 的错误请求。
这里是可以正常工作的 curl 命令:
curl -k -X PUT -H "Authorization:token here" -F 'resources=[]' -F "application=@/tmp/cfdownloadF9AxlE" https://api.cloudfoundry.com/v2/apps/2d0f491b-d8dd-4b3a-96f9-58b3678e5dad/bits
有谁知道如何使用上面的 guzzle 代码让它工作?
我已经解决了这个问题。事实证明这不是发送数组的问题,而是 guzzle 抛出的另一个错误掩盖了真正的问题。
首先我将 guzzle 设置为调试,并关闭异常(见下文)。 Guzzle 如果未关闭,将屏蔽来自第三方的实际异常。我得到了 400 个正确的错误响应,但它隐藏了实际消息,即我试图发送的文件无法解压缩。然后我决定更改多部分请求以使用 guzzle 文档中的 'fopen' 选项,而不是使用 cloudfoundry 文档中的“@”。这解决了问题,现在一切正常。请参阅下面的更新请求。
new Client(['debug'=>true,'exceptions'=>false,'headers' => ['Authorization' => "Bearer " . $token, "Accept" => "application/json"], 'verify' => false])
guzzle 请求:
$response = $this->client->put($this->baseUrl . "apps/cb44bb975-654e-4516-8ce9-b37bc2f93a87/bits", [
'multipart' => [
[
'name' => 'resources',
'contents' => '[]'
],
[
'name' => 'application',
'contents' => fopen('/tmp/cfdownloadYQfOp7', 'r')
]
]
]);