RestTemplate + OkHttp3 - gzip'ed响应的透明处理?
Posted
技术标签:
【中文标题】RestTemplate + OkHttp3 - gzip\'ed响应的透明处理?【英文标题】:RestTemplate + OkHttp3 - transparent processing of gzip'ed response?RestTemplate + OkHttp3 - gzip'ed响应的透明处理? 【发布时间】:2021-12-23 11:22:25 【问题描述】:我一直在寻找如何使用将 OkHttp3 设置为其 http 客户端的 RestTemplate 启用 gzip 响应的透明处理。
下面是我如何为 RestTemplate 定义 bean:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder)
RestTemplate restTemplate = restTemplateBuilder //
.rootUri(_endpoint) //
.additionalInterceptors(new ClientHttpRequestInterceptor()
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException
request.getHeaders().add(HttpHeaders.ACCEPT_ENCODING, "gzip");
ClientHttpResponse response = execution.execute(request, body);
return response; // if I set a breakpoint here, I
// can see it's OkHttp3ClientHttpResponse
) //
.build();
return restTemplate;
在我的pom.xml
我有:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
确定有a solution 来启用gzip 响应处理。但对我来说,这并不透明。
RestTemplate + Apache HttpClient 有 a solution,我只需要将 pom.xml
依赖项切换到
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
它适用于上面相同的 Bean 代码。这就是我所说的透明。但是由于多种原因,我不得不使用 OkHttp3。
我查看了 OkHttp3 的官方文档,但没有给出具体说明。这很讽刺,因为如果它真的是透明的,我应该不需要做任何事情。
如果有人知道任何细节,请帮助。赞赏!
【问题讨论】:
【参考方案1】:不设置Accept-Encoding或Range是透明的。
https://github.com/square/okhttp/blob/f8fd4d08decf697013008b05ad7d2be10a648358/okhttp/src/main/kotlin/okhttp3/internal/http/BridgeInterceptor.kt#L66-L73
添加一个日志拦截器作为 networkInterceptor,这样您就可以看到正在发送和接收的标头。这应该在解压缩之前显示压缩后的响应
https://github.com/square/okhttp/blob/f8fd4d08decf697013008b05ad7d2be10a648358/okhttp/src/main/kotlin/okhttp3/internal/http/BridgeInterceptor.kt#L90-L104
【讨论】:
谢谢。我应该读过代码,但我相信我不会是唯一一个有这个问题的人。 是的,它确实出现在类似的 *** questios 和各种 OkHttp 教程中,所以你不是唯一的。 “透明 GZIP 缩小下载大小”听起来是自动的。以上是关于RestTemplate + OkHttp3 - gzip'ed响应的透明处理?的主要内容,如果未能解决你的问题,请参考以下文章
从 Android N (--min-api 24) 开始支持:okhttp3.Request okhttp3.Authenticator