【问题标题】:Sending Gzip compressed data with Spring Android RestTemplate?使用 Spring Android RestTemplate 发送 Gzip 压缩数据?
【发布时间】:2015-02-11 08:34:19
【问题描述】:

当前Spring Android documentation 在第 2.2.2 节中说:

RestTemplate 支持发送和接收使用 gzip 压缩编码的数据。

然而,本文档在第 2.7.2 节中解释了如何接收 Gzip 数据,但没有关于发送 gzip 数据(使用 POST 或 PUT)。它是一个缺失的功能,所以介绍会是错误的吗?或者有什么秘密方法可以启用 gzip 压缩?

【问题讨论】:

    标签: spring-android


    【解决方案1】:

    只是为了与 AcceptEncoding:gzip 分享我的 RestTemplate 请求的工作代码

    RestTemplate restTemplate = new RestTemplate();  
    HttpHeaders requestHeaders = new HttpHeaders();  
    requestHeaders.setAcceptEncoding(ContentCodingType.GZIP); 
    HttpEntity<Coordinates> requestEntity = new HttpEntity<Coordinates>(coordinates, requestHeaders); 
    ResponseEntity<Integer> responseEntity = restTemplate.exchange(url, HttpMethod.PUT, requestEntity, Integer.class);
    

    @Stoozi 的源代码对我不起作用(如果你简单地使用它不会收到压缩响应)我已经用 SoapUI 对其进行了测试

    请求:

    GET http://localhost:8081/jaxrs/admin-adblock
    Accept:application/json
    Cache-Control:no-cache
    Content-Type:application/json
    Authorization:Basic c21h... 
    Accept-Encoding:gzip,deflate
    

    回复:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 204
    Server: Jetty(9.2.2.v20140723)
    

    它需要在 RestTemplate REQUEST 标头中使用setAcceptEncoding() 而不是setContentEncoding()

    【讨论】:

      【解决方案2】:

      请求的 GZip 压缩基于 RestTemplate 正在处理的请求的“Content-Encoding”标头。将此标头设置为“gzip”将为您的请求启用 Gzip 压缩。幸运的是,有一些常量和辅助函数可以让这变得简单:

      HttpHeaders headers = new HttpHeaders();
      headers.setContentEncoding(ContentCodingType.GZIP);
      //...then use headers when making request with RestTemplate instance
      

      在启用 Gzip 压缩的情况下使用 ClientHttpRequestInterceptor 时要小心,因为这将多次压缩您的请求正文(取决于您配置了多少拦截器),正如我在此处描述的: RestTemplate with ClientHttpRequestInterceptor causes GZIP compression twice

      【讨论】:

      • 响应的 GZip 压缩基于请求的“Content-Encoding”基于“Accept-Encoding”标头。它需要有 headers.setAcceptEncoding(ContentCodingType.GZIP);
      • 在请求中使用 GZIP 的 Accept-Encoding 标头值向服务器表明您希望响应是 GZIP 编码的。问题是如何在请求中发送 GZIP 编码数据,这是通过将请求的“Content-Encoding”标头设置为 GZIP 来完成的
      • 如果来自客户端应用程序的请求具有 Accept-Encoding:gzip 标头响应,来自服务器应用程序的响应将具有 Content-Encoding:gzip 标头。 RestTemplate 在客户端,它需要 setAcceptEncoding 标头以使用来自服务器的 Content-Encoding: gzip 标头进行压缩响应。它需要在您的答案中更改请求/响应的标题:)
      • 我们在 Gzip 编码响应方面是一致的。但是这个问题专门针对在请求中发送 Gzip 编码的内容,这是我原来的答案提供的
      • 这是我使用 Android RestTemplate 客户端请求的工作代码:requestHeaders.setAcceptEncoding(ContentCodingType.GZIP); HttpEntity requestEntity = new HttpEntity(coordinates, requestHeaders); ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.PUT, requestEntity, Integer.class);
      猜你喜欢
      • 2021-06-18
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2016-06-13
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多