用Guzzle发送gzip请求

时间:2017-04-03 14:43:29

标签: php symfony gzip guzzle

我必须进行HTTP调用才能发送数据压缩数据。我正在开发Symfony2。对于HTTP调用,我使用的是Guzzle客户端(版本3.8.1)。此外,我使用Guzzle服务描述来描述每个命令允许的操作。

我知道我必须在请求中添加标题“Content-Encoding:gzip”,但请求正文未被压缩。

有没有办法在Guzzle客户端中指定需要压缩请求? (可以在服务描述中指定)

谢谢!

2 个答案:

答案 0 :(得分:3)

告知服务器为您提供压缩版本,您必须告知它您已了解如何解压缩数据。

为此,您在请求期间发送标头Accept-Encoding

accept-encoding标头和值的示例(这些是您的客户端知道使用的压缩方案):

accept-encoding:gzip, deflate, sdch, br

服务器发送 RESPONSE 标头Content-Encoding。如果设置了标头,那么您的客户端断言内容已被压缩并使用服务器发送的算法作为Content-Encoding的值。

服务器不必回复压缩页面。

因此,这些是以下步骤:

  1. 告诉服务器您知道如何处理压缩页面。您发送 accept-encoding标头,然后指定客户知道如何处理的压缩算法。

  2. 检查服务器是否发送了Content-Encoding标头。如果没有,内容不会被压缩

  3. 如果是,请检查标题的。这告诉你哪个算法用于压缩,它不必是gzip,但通常是。

  4. 服务器不必使用压缩页面进行响应。您只是告知服务器您了解如何处理压缩页面。

  5. 因此,对您而言,您应该做的是验证您的服务器是否发送了gzip压缩响应,然后您应该设置请求标头accept-encoding。你得到了错误的方法。

答案 1 :(得分:1)

我找到了一个使用Guzzle客户端发送压缩数据的解决方案,其中包含操作命令和服务描述。

在包含服务描述的JSON文件中,我已指定在body中发送的数据是字符串:

{
  ...
  "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不会自动压缩数据。 header已设置,因此需要先压缩数据,然后再将其发送到Guzzle客户端执行命令。我已经序列化了对象并使用了" gzencode($ string)"用于按压。

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