Guzzle在多部分请求中发送空数组

时间:2015-05-29 15:41:58

标签: php laravel guzzle

我正在使用Guzzle 6向第三方API(云代工)发送多部分表单请求。 api采用2个参数“资源”和“应用程序”。 here是我正在进行的电话会议的文件。简而言之,这将二进制文件部署到应用程序服务器。下面是我在Guzzle中使用的代码。尝试发送空数组作为“resource”参数的内容时,我收到“无效资源类型”错误。 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代码让它工作?

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题。原来这不是发送一个数组的问题,而是另一个错误被guzzle抛出,掩盖了真正的问题。

首先我设置guzzle进行调试,并关闭异常(见下文)。如果没有关闭,Guzzle将掩盖第三方的实际例外情况。我得到了400个错误的响应,这是正确的,但它隐藏了实际的消息,即我试图发送的文件无法解压缩。然后我决定更改多部分请求以使用' fopen'来自guzzle文档的选项,而不是使用' @'来自cloudfoundry文档。这解决了问题,现在一切正常。请参阅belwo了解更新的请求。

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')
             ]
         ]
     ]);
相关问题