2016-03-03 117 views
0

以下代码片段可在GuzzleHttp v5中使用。将GuzzleHttp v5升级到v6

$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,但这只是回避这个问题。

+0

你在问如何制定请求吗?你是试图传输文件,还是一次性发送它?您是否正试图发布您的文件?如果是这样,为什么可以在Content-Type头部中找到的信息放置在Uri中而不在头部内? –

+0

这样做是因为接收数据的服务器的规范需要这种方式,这个请求的所有内容都包含在URI中,包括jsessionid,它也在头部显示,如图所示。如上所示,Guzzle v5的代码是微不足道的,但v6已经改变了所有这一切,并且现在已不再明确如何制定这个请求。所以,问题是如何将上面的代码段编码为Guzzle v6?对于星期一的演示,我已经使用了Guzzle v5,但它迟早需要改变。 –

回答

1

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

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

感谢Shaun Bramley指引我朝着正确的方向前进。

+0

由于5.3中的流量控制,我正处于围墙之上。很高兴我能指出你在正确的方向。 –

0

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

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

为您进行最简单的方法,应尽可能FOL:

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

默认状态下暴饮被传递作为数组作为PostBody是5.3过的物体PARAMS。这意味着数组索引和值最终被urlencoded作为字符串使用http_build_query

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

+0

非常感谢。我对愚蠢的无知是痛苦的显而易见的。演示完成后,我会试一试,一旦我证实了它的工作,就标记答案。 –

+0

不幸的是,该解决方案似乎没有工作。发送到Filedata变量中的服务器的数据是空的。我使用了一个小文件来避免任何超时限制。看起来好像在创建请求时没有读取文件流。 –