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响应的透明处理?的主要内容,如果未能解决你的问题,请参考以下文章

okhttp3使用

从 Android N (--min-api 24) 开始支持:okhttp3.Request okhttp3.Authenticator

Java封装OkHttp3工具类

Picasso:设置旧版本的 OkHttp3

Android实战——okhttp3的使用和封装

Okhttp3:使用 HeaderInterceptor 需要帮助