2017-04-03 104 views
0

我必須進行HTTP調用來發送數據壓縮數據。我正在Symfony2中開發。對於HTTP調用,我使用Guzzle客戶端(版本3.8.1)。另外,我正在使用Guzzle服務描述來描述每個命令允許的操作。發送帶有Gzzle的gzip請求

我知道我必須在請求中添加標題「Content-Encoding:gzip」,但請求主體未被壓縮。

有沒有辦法在Guzzle客戶端指定請求需要壓縮? (可以在服務描述中指定)

謝謝!

回答

0

我發現了一個解決方案,用於發送使用Guzzle客戶端壓縮的操作命令和服務描述數據。

在包含服務描述JSON文件我已經指定了在體發送的數據是一個字符串:

{ 
    ... 
    "operations": { 
    "sendCompressedData": { 
     "httpMethod": "POST", 
     "uri": ..., 
     "parameters": { 
     "Content-Type": { 
      "location": "header", 
      "required": true, 
      "type": "string", 
      "default": "application/json" 
     }, 
     "Content-Encoding": { 
      "location": "header", 
      "required": true, 
      "type": "string", 
      "default": "gzip" 
     }, 
     "data": { 
      "location": "body", 
      "required": true, 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

正如@Mjh提到的,狂飲不壓縮數據自動如果「內容編碼」頭部被設置,因此數據在發送到Guzzle客戶端執行命令之前需要被壓縮。我已經序列化了這個對象,並使用「gzencode($ string)」來進行壓縮。

$serializedData = SerializerBuilder::create()->build()->serialize($request, 'json'); 
$compressedData = gzencode($serializedData); 
... 
$command = $this->client->getCommand('sendCompressedData', array('data' => $compressedData)); 
$result = $command->execute(); 
3

告訴服務器給你壓縮版本,你必須告訴它,你知道如何解壓縮數據。

爲此目的,您發送在請求期間標題爲Accept-Encoding

實施例的accept-encoding標題和值(這些是客戶端知道使用壓縮方案):

accept-encoding:gzip, deflate, sdch, br 

RESPONSEContent-Encoding由服務器發送。如果設置了該標題,則客戶端斷言內容已被壓縮,並使用服務器發送的算法作爲值Content-Encoding

服務器不必響應壓縮頁面。

因此,這些步驟如下:

  1. 告訴你知道如何處理壓縮的網頁服務器。你發送accept-encoding頭,然後你指定你的客戶知道如何處理哪些壓縮算法。

  2. 檢查服務器是否發送了Content-Encoding頭。如果不是,則內容不被壓縮

  3. 如果是,請檢查標頭的。這告訴你哪個算法用於壓縮,它不一定是gzip,但通常是。

  4. 服務器不必響應壓縮頁面。您只是通知服務器您瞭解如何處理壓縮頁面。

所以,對你來說,你應該做的是驗證您的服務器發送gzip壓縮的響應,那麼你應該設置的請求頭accept-encoding。你弄錯了它。

+0

謝謝你的回覆,但我想我沒有提供足夠的信息。 我是客戶端,我必須將壓縮數據發送到服務器。我不需要告訴服務器使用壓縮數據做出響應,這就是爲什麼我要說我必須添加請求「Content-Encoding:gzip」頭文件。 –

+1

設置'Content-Encoding'不會讓gzip正文,Guzzle只是傳輸層 - 它不知道你要發送的數據是什麼,這是你的工作。你必須'gzip($ your_body);'。 – Mjh

+0

感謝您的信息。我遵循了您的建議,並能夠使用Guzzle客戶端發送帶有命令和服務描述的壓縮數據。 –

相關問題