「转载请说明出处:http://blog.csdn.net/kepoon/article/details/7482096」
gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序。
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动。
当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据。
从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-Encoding=gzip 。
我们现在从浏览器上访问玩啥网站都是gzip格式传输的。
但是我们现在android 客户端,没有用gzip 格式访问。
同样的的道理,我们可以在android 客户端 request 头中加入 "Accept-Encoding", "gzip" ,来让服务器传送gzip 数据。
具体代码如下。
private String getJsonStringFromGZIP(HttpResponse response) {
String jsonString = null;
try {
InputStream is = response.getEntity().getContent();
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(2);
// 取前两个字节
byte[] header = new byte[2];
int result = bis.read(header);
// reset输入流到开始位置
bis.reset();
// 判断是否是GZIP格式
int headerData = getShort(header);
// Gzip 流 的前两个字节是 0x1f8b
if (result != -1 && headerData == 0x1f8b) {
LogUtil.d("HttpTask", " use GZIPInputStream ");
is = new GZIPInputStream(bis);
} else {
LogUtil.d("HttpTask", " not use GZIPInputStream");
is = bis;
}
InputStreamReader reader = new InputStreamReader(is, "utf-8");
char[] data = new char[100];
int readSize;
StringBuffer sb = new StringBuffer();
while ((readSize = reader.read(data)) > 0) {
sb.append(data, 0, readSize);
}
jsonString = sb.toString();
bis.close();
reader.close();
} catch (Exception e) {
LogUtil.e("HttpTask", e.toString(),e);
}
LogUtil.d("HttpTask", "getJsonStringFromGZIP net output: " + jsonString );
return jsonString;
}
private int getShort(byte[] data) {
return (int)((data[0]<<8) | data[1]&0xFF);
}
参考 ,注意实际使用中,我发现gzip 流前两个字节是0x1e8b ,不是0x1f8b .后来检查一下code ,代码处理错误,加上第二个字节的时候需 &0xFF
0x1f8b 可参考标准http://www.gzip.org/zlib/rfc-gzip.html#file-format
http://xmagicj.diandian.com/post/2011-08-08/3641381
分享到:
相关推荐
主要介绍了Android GZip的使用-开发中网络请求的压缩实例详解的相关资料,需要的朋友可以参考下
android网络请求框架之OkHttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,但仍可引入Jar包使用)。 OkHttp是一个...
OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题 Get请求 ...
Demo封装了HttpURLConnection、xUtlis、Volley、OkHttp、Gzip实现数据压缩的框架
(5) 默认gzip压缩 (6) 支持解析成Json格式 (7) 可将Cookies持久化到SharedPreferences 3、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 主要有四大模块: (1) 数据库模块:android中的orm框架,...
支持Cookie持久化,支持Gzip压缩 支持协议头参数Head设置 支持二进制参数、JSON、表单提交、SOAP提交 支持Gson解析、Unicode自动转码、请求参数编码以及服务器响应编码设置 支持四种缓存类型请求:仅网络、仅缓存、...
OkHttp是目前非常火的网络库,支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接,连接池减少请求延时,透明的GZIP压缩减少响应数据的大小,缓存响应内容,避免一些完全重复的请求。 在开始之前,首先...
使用GZIP压缩减少传输的数据量 缓存响应避免重复的网络请求 当你的网络出现拥挤的时候,就是OKHttp 大显身手的时候, 它可以避免常见的网络问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败, OkHT
CoolxLib主要模块功能:网络请求模块,数据库操作模块,万能工具类模块,上传头像模块,网络请求模块: 支持自动解析JSON数据 支持可配置缓存 支持网络异常自动重试机制 支持网络错误自动处理 无缝的支持GZIP来减少数据...
okhttp3.2.0jar包,okhttp3jar包是一款可以支持android网络框架之OKhttp的jar包,一个处理网络请求的开源项目,是目前android安卓端最火热的轻量级框架。 okhttp3.2.0jar包框架特色 ·允许连接到同一个主机地址...
如果帮到您了能不能给个赞,赞多的话我...3.OnSuccessAndFaultSub类:封装回调,项目中接收的是gzip压缩过的流 4.各种Api类:根据业务模块划分,实现观察者和被观察者的订阅。 5.operator包下是解释操作符相关的,可以全
一、简介 关于okhttp相信不做介绍,大家也都知道... 自动处理GZip压缩 说白了就是可以更加有效快速的通过Http请求获取数据,并且能够节省流量减小带宽。 二、使用 2.1 依赖注入 compile 'com.squareup.okhttp3:okht
2.Android艺术开发与探索 3.Android设计模式 第三方框架 详细使用步骤加源码解析:1.会使用 2.懂原理 3.框架源码解析 网络框架: 1.Volley框架二次封装 2.Volley框架源码解析 郭霖: okhttp square 开源的 http 工具...
本文详细总结了Android编程开发之性能优化技巧。分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,...
Android 6.0采用的SPDY支持HTTP上GZIP压缩的传输,这使得OkHttp包的功能能够进一步被利用,本文我们来总结一下Android M(6.0)使用OkHttp包解析和发送JSON请求的教程
Gzip / Deflate压缩 通过HTTP连接进行连接池/重用:保持活动状态 如果服务器具有多个IP地址,则使用来自服务器的最佳/稳定连接 饼干 支持文件:/,http:/和内容:/ URI 请求级别的 像这样的进行请求分析 基于和 ...
支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由、连接协议、拦截器、代理、安全性认证、连接池以及网络适配,拦截器主要是++指添加,...
OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势。(GitHub页:https://github.com/square/okhttp) Android为我们提供了两...
3 透明的GZIP(压缩格式)缩小下载大小 4 回应的缓存完全避免网络重复请求 当网络出现问题的时候,OKHTTP会依然有效:它将从常见的连接问题当中恢复。如果你的服务端有多个IP地址,当第一个地址连接失败时,OKHTTP...