我必須進行HTTP調用來發送數據壓縮數據。我正在Symfony2中開發。對於HTTP調用,我使用Guzzle客戶端(版本3.8.1)。另外,我正在使用Guzzle服務描述來描述每個命令允許的操作。發送帶有Gzzle的gzip請求
我知道我必須在請求中添加標題「Content-Encoding:gzip」,但請求主體未被壓縮。
有沒有辦法在Guzzle客戶端指定請求需要壓縮? (可以在服務描述中指定)
謝謝!
我必須進行HTTP調用來發送數據壓縮數據。我正在Symfony2中開發。對於HTTP調用,我使用Guzzle客戶端(版本3.8.1)。另外,我正在使用Guzzle服務描述來描述每個命令允許的操作。發送帶有Gzzle的gzip請求
我知道我必須在請求中添加標題「Content-Encoding:gzip」,但請求主體未被壓縮。
有沒有辦法在Guzzle客戶端指定請求需要壓縮? (可以在服務描述中指定)
謝謝!
我發現了一個解決方案,用於發送使用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();
要告訴服務器給你壓縮版本,你必須告訴它,你知道如何解壓縮數據。
爲此目的,您發送在請求期間標題爲Accept-Encoding
。
實施例的accept-encoding
標題和值(這些是客戶端知道使用壓縮方案):
accept-encoding:gzip, deflate, sdch, br
的RESPONSE頭Content-Encoding
由服務器發送。如果設置了該標題,則客戶端斷言內容已被壓縮,並使用服務器發送的算法作爲值Content-Encoding
。
服務器不必響應壓縮頁面。
因此,這些步驟如下:
告訴你知道如何處理壓縮的網頁服務器。你發送accept-encoding
頭,然後你指定你的客戶知道如何處理哪些壓縮算法。
檢查服務器是否發送了Content-Encoding
頭。如果不是,則內容不被壓縮
如果是,請檢查標頭的值。這告訴你哪個算法用於壓縮,它不一定是gzip,但通常是。
服務器不必響應壓縮頁面。您只是通知服務器您瞭解如何處理壓縮頁面。
所以,對你來說,你應該做的是驗證您的服務器發送gzip壓縮的響應,那麼你應該設置的請求頭accept-encoding
。你弄錯了它。
謝謝你的回覆,但我想我沒有提供足夠的信息。 我是客戶端,我必須將壓縮數據發送到服務器。我不需要告訴服務器使用壓縮數據做出響應,這就是爲什麼我要說我必須添加請求「Content-Encoding:gzip」頭文件。 –
設置'Content-Encoding'不會讓gzip正文,Guzzle只是傳輸層 - 它不知道你要發送的數據是什麼,這是你的工作。你必須'gzip($ your_body);'。 – Mjh
感謝您的信息。我遵循了您的建議,並能夠使用Guzzle客戶端發送帶有命令和服務描述的壓縮數據。 –