【问题标题】:Send gzip request with Guzzle使用 Guzzle 发送 gzip 请求
【发布时间】:2017-08-28 11:55:21
【问题描述】:

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

我知道要在请求中添加header“Content-Encoding:gzip”,但是请求体没有被压缩。

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

谢谢!

【问题讨论】:

    标签: php symfony gzip guzzle


    【解决方案1】:

    告诉服务器给你压缩版本,你必须告诉它你知道如何解压数据。

    为此,您在请求期间发送一个名为Accept-Encoding 的标头。

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

    accept-encoding:gzip, deflate, sdch, br
    

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

    服务器不必响应压缩页面。

    因此,这些是步骤:

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

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

    3. 如果是,请检查标头的。这会告诉您使用哪种算法进行压缩,不一定是 gzip,但通常是。

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

    所以,对你来说,你应该做的是验证你的服务器是否发送了压缩响应,然后你应该设置请求标头accept-encoding。你搞错了。

    【讨论】:

    • 感谢您的回复,但我认为我没有提供足够的信息。我是客户端,我必须将压缩数据发布到服务器。我不需要告诉服务器以压缩数据响应,这就是为什么我说我必须在请求中添加“Content-Encoding:gzip”标头。
    • 设置 Content-Encoding 不会压缩正文,Guzzle 只是传输层 - 它不知道 与您发送的数据有什么关系,这是您的工作.你必须gzip($your_body);
    • 感谢您提供的信息。我已经听从了您的建议,并且能够使用 Guzzle 客户端发送压缩数据以及命令和服务描述。
    • 太好了,很高兴这些信息对您有所帮助!祝你有美好的一天。
    【解决方案2】:

    我找到了一种使用 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 所说,如果设置了“Content-Encoding”标头,Guzzle 不会自动压缩数据,因此需要在将数据发送到 Guzzle 客户端执行命令之前对其进行压缩。我已序列化对象并使用“gzencode($string)”进行压缩。

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

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2020-07-14
      • 1970-01-01
      • 2019-12-12
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多