结论
- 去除
application.yml
中的压缩配置
或 - 配置响应拦截器,解压缩响应体
/**
* 响应解压缩拦截器
*
* @author zhang.rx
* @since 2024/4/11
*/
public class ResponseCompressionInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
// 响应头的Content-Encoding中包含gzip,说明响应需要解压
if ("gzip".equalsIgnoreCase(originalResponse.header("Content-Encoding"))) {
return originalResponse.newBuilder()
.body(gzip(originalResponse))
.build();
}
return originalResponse;
}
private ResponseBody gzip(Response response) throws IOException {
BufferedSource source = Okio.buffer(new GzipSource(response.body().source()));
return ResponseBody.create(response.body().contentType(), response.body().contentLength(), source);
}
}
然后在创建OkHttpClient.Builder()的地方配置拦截器
OkHttpClient.Builder().addInterceptor(new ResponseCompressionInterceptor())
出现场景
服务1
通过 okhttp3 去请求 服务2
的接口,但是服务2
由于在application.yml
中配置了:
server:
compression:
enabled: true
mime-types: application/json,text/plain
导致服务2
在响应的时候会将json
进行压缩,然后返回数据给服务1
。
当然,将
enabled
设置为false
,不加拦截器也可以达到相同的效果。