`
kerlubasola
  • 浏览: 673446 次
文章分类
社区版块
存档分类
最新评论

Android开发中网络请求的压缩 ── GZip的使用

 
阅读更多

「转载请说明出处: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 GZip的使用-开发中网络请求的压缩实例详解的相关资料,需要的朋友可以参考下

    OkHttp基本使用教程(安卓端http请求框架)

    android网络请求框架之OkHttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,但仍可引入Jar包使用)。 OkHttp是一个...

    Android网络请求之OkHttp

    OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题 Get请求 ...

    网络请求的封装

    Demo封装了HttpURLConnection、xUtlis、Volley、OkHttp、Gzip实现数据压缩的框架

    Android 常用六大框架

    (5) 默认gzip压缩 (6) 支持解析成Json格式 (7) 可将Cookies持久化到SharedPreferences 3、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 主要有四大模块: (1) 数据库模块:android中的orm框架,...

    Android代码-OkHttp3

    支持Cookie持久化,支持Gzip压缩 支持协议头参数Head设置 支持二进制参数、JSON、表单提交、SOAP提交 支持Gson解析、Unicode自动转码、请求参数编码以及服务器响应编码设置 支持四种缓存类型请求:仅网络、仅缓存、...

    Android小知识之OkHttp的2种请求方式详解

    OkHttp是目前非常火的网络库,支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接,连接池减少请求延时,透明的GZIP压缩减少响应数据的大小,缓存响应内容,避免一些完全重复的请求。 在开始之前,首先...

    Android中使用OkHttp包处理HTTP的get和post请求的方法

    使用GZIP压缩减少传输的数据量 缓存响应避免重复的网络请求 当你的网络出现拥挤的时候,就是OKHttp 大显身手的时候, 它可以避免常见的网络问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败, OkHT

    CoolxLib:很早的,android 内部使用基础框架 网络请求、数据库操作、通用基础工具类、日志系统、缓存

    CoolxLib主要模块功能:网络请求模块,数据库操作模块,万能工具类模块,上传头像模块,网络请求模块: 支持自动解析JSON数据 支持可配置缓存 支持网络异常自动重试机制 支持网络错误自动处理 无缝的支持GZIP来减少数据...

    okhttp v3.2.00jar包.zip

    okhttp3.2.0jar包,okhttp3jar包是一款可以支持android网络框架之OKhttp的jar包,一个处理网络请求的开源项目,是目前android安卓端最火热的轻量级框架。   okhttp3.2.0jar包框架特色 ·允许连接到同一个主机地址...

    Rxjava2Retrofit2NetFrame::fire:基于Retrofit+Rxjava+Okhttp的网络请求框架

    如果帮到您了能不能给个赞,赞多的话我...3.OnSuccessAndFaultSub类:封装回调,项目中接收的是gzip压缩过的流 4.各种Api类:根据业务模块划分,实现观察者和被观察者的订阅。 5.operator包下是解释操作符相关的,可以全

    盘点常用的Android开发库(6) — OkHttp

    一、简介 关于okhttp相信不做介绍,大家也都知道... 自动处理GZip压缩 说白了就是可以更加有效快速的通过Http请求获取数据,并且能够节省流量减小带宽。   二、使用 2.1 依赖注入 compile 'com.squareup.okhttp3:okht

    安卓java读取网页源码-AndroidStudy:Android进阶内容整理

    2.Android艺术开发与探索 3.Android设计模式 第三方框架 详细使用步骤加源码解析:1.会使用 2.懂原理 3.框架源码解析 网络框架: 1.Volley框架二次封装 2.Volley框架源码解析 郭霖: okhttp square 开源的 http 工具...

    Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧。分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,...

    Android M(6.x)使用OkHttp包解析和发送JSON请求的教程

    Android 6.0采用的SPDY支持HTTP上GZIP压缩的传输,这使得OkHttp包的功能能够进一步被利用,本文我们来总结一下Android M(6.0)使用OkHttp包解析和发送JSON请求的教程

    离子:Android异步网络和图像加载

    Gzip / Deflate压缩 通过HTTP连接进行连接池/重用:保持活动状态 如果服务器具有多个IP地址,则使用来自服务器的最佳/稳定连接 饼干 支持文件:/,http:/和内容:/ URI 请求级别的 像这样的进行请求分析 基于和 ...

    百度地图开发java源码-TestOkHttpUtils:OkHttp的练习使用,先使用原生的OkHttp,接着使用鸿洋大神的okhttput

    支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由、连接协议、拦截器、代理、安全性认证、连接池以及网络适配,拦截器主要是++指添加,...

    Android使用OKHttp包处理HTTP相关操作的基本用法讲解

    OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势。(GitHub页:https://github.com/square/okhttp) Android为我们提供了两...

    okhttp-2.1.0.jar okip-1.0.1.jar

    3 透明的GZIP(压缩格式)缩小下载大小 4 回应的缓存完全避免网络重复请求 当网络出现问题的时候,OKHTTP会依然有效:它将从常见的连接问题当中恢复。如果你的服务端有多个IP地址,当第一个地址连接失败时,OKHTTP...

Global site tag (gtag.js) - Google Analytics