博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Okhttp3请求网络开启Gzip压缩
阅读量:5916 次
发布时间:2019-06-19

本文共 2071 字,大约阅读时间需要 6 分钟。

前沿

首先OkHttp3是支持Gzip解压缩的,不过我们要明白,它是支持我们在发起请求的时候自动加入header,Accept-Encoding: gzip,而我们的服务器返回的时候header中有Content-Encoding: gzip

关于更多深入的内容呢,可以参考阅读下面这篇文章,讲的非常好!

那么,我们在向服务器提交大量数据的时候,希望对post的数据进行gzip压缩,改怎么办?

下边给出方案!

方案

官方采用的是自定义拦截器的方式!

源码在:
废话不多说,直接上代码:

1 import java.io.IOException; 2  3 import okhttp3.Interceptor; 4 import okhttp3.MediaType; 5 import okhttp3.Request; 6 import okhttp3.RequestBody; 7 import okhttp3.Response; 8 import okio.BufferedSink; 9 import okio.GzipSink;10 import okio.Okio;11 12 public class GzipRequestInterceptor implements Interceptor {13     @Override14     public Response intercept(Chain chain) throws IOException {15         Request originalRequest = chain.request();16         if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {17             return chain.proceed(originalRequest);18         }19 20         Request compressedRequest = originalRequest.newBuilder()21                 .header("Content-Encoding", "gzip")22                 .method(originalRequest.method(), gzip(originalRequest.body()))23                 .build();24         return chain.proceed(compressedRequest);25     }26 27     private RequestBody gzip(final RequestBody body) {28         return new RequestBody() {29             @Override30             public MediaType contentType() {31                 return body.contentType();32             }33 34             @Override35             public long contentLength() {36                 return -1; // 无法提前知道压缩后的数据大小37             }38 39             @Override40             public void writeTo(BufferedSink sink) throws IOException {41                 BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));42                 body.writeTo(gzipSink);43                 gzipSink.close();44             }45         };46     }47 }

然后构建OkhttpClient的时候,添加拦截器:

OkHttpClient okHttpClient = new OkHttpClient.Builder()     .addInterceptor(new GzipRequestInterceptor())//开启Gzip压缩    ...    .build();

后记

如果需要带有内容长度content-length的,可以查看这个issue:

参考:

转载于:https://www.cnblogs.com/ganchuanpu/p/9062788.html

你可能感兴趣的文章
Intel和ARM中国市场的芯片之战一触即发
查看>>
青云QingCloud上海1区正式商用:四大升级 连接未来
查看>>
抓住售后服务 抓住新的收入流
查看>>
亲们,不用再创建变更了
查看>>
2021年3GPP物联网标准将占蜂窝物联网无线节点出货量一半以上
查看>>
Oracle 12c的一些新等待事件
查看>>
刀片服务器故障一例
查看>>
第四章—使用函数
查看>>
使用 JFreeChart来创建基于web的图表
查看>>
Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
查看>>
马哥2016全新Linux+Python高端运维班-Linux用户创建及权限管理
查看>>
699的高性价比,大神F1极速版体验一览
查看>>
开放与互联:透明工厂如何引领中国制造升级?
查看>>
Linux下添加php的zip模块
查看>>
memcache
查看>>
Percona XtraBackup备份数据库关于数据路径默认选择和show variables
查看>>
单例模式和静态方法的区别
查看>>
android 获取系统默认路径
查看>>
Highcharts API中英对照查询表
查看>>
Docker 网络管理
查看>>