2016-03-03 42 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變量中的服務器的數據是空的。我使用了一個小文件來避免任何超時限制。看起來好像在創建請求時沒有讀取文件流。 –