3

当前的Spring Android 文档在第 2.2.2 节中说:

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

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

4

2 回答 2

3

请求的 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 会导致 GZIP 压缩两次

于 2015-01-20T17:43:47.740 回答
0

只是为了与 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)

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

于 2015-09-18T16:03:43.810 回答