gzip介绍

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

HTTP 请求头中的编码类型字段

在 HTTP 传输时是支持 gzip 压缩的,客户端发起请求时在请求头里增加 Accept-Encoding: gzip,服务端响应时在返回的头信息里增加 Content-Encoding: gzip,这表示传输的数据是采用 gzip 压缩的。默认情况下,传输内容是不压缩的,采用gzip压缩可以大幅减少传输内容大小,这样可以提高传输速度,减少流量的使用。

response headers中的Content-Encoding

通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding 中通知客户端该选择。

request headers 中的Accept-Encoding

HTTP请求头Accept-Encoding会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。

取值类型列表

常见的取值类型有:

类型 含义
gzip gzip类型压缩
compress 支持compress
identity 默认值,表示不需要进行任何编码
* 匹配其他任意未在该请求头字段中列出的编码方式。
br 表示采用 Brotli 算法的编码方式
deflate 采用 zlib 结构和 deflate 压缩算法

Android网络传输中gzip的使用

Android的URLConnection的gzip压缩

在Android 2.3.3版本之后,HttpURLConnection发请求时,默认的request hearder里会加上 Accept-Encoding: gzip。

参见: http://developer.android.com/reference/java/net/HttpURLConnection.html

在Android4.4以后底层是由OkHttp实现的,所以4.4之后的版本,Content-Length被移除,getContentLength()为 -1。

我们可以手动设置"Accept-Encoding"字段,来解除针对gzip的默认行为。

OkHttp的gzip压缩

OkHttp是默认支持gzip解压缩的,不需要额外配置的。

OkHttp会额外的增加很多请求头信息,如果我们在代码里没有手动设置Accept-Encoding = gzip ,那么OkHttp会自动处理gzip的解压缩。具体源码可以查看BridgeInterceptor这个类,如果header中没有Accept-Encoding,默认自动添加,且标记变量transparentGzip为true。

OkHttp在处理请求结果时,如果成功返回,并获取到内容,则移除Content-Encoding、Content-Length,并对结果进行解压缩。

在OkHttp中,如果在请求头添加addHeader(“Accept-Encoding”, “gzip, deflate”),Okhttp不会帮你处理Gzip的解压,需要你自己去处理。

OkHttp默认使用gzip压缩,但是会把返回数据的大小length修改为-1,我们如果想获取一些进度或者大小相关的信息,就会出现问题,这时可以手动设置"Accept-Encoding"字段,手动来解析gzip压缩后的数据。

URLConnection的gzip压缩:

  1. 2.3后默认是gzip的,默认Accept-Encoding会被自动添加上Accept-Encoding:gzip。
  2. 默认情况下,response支持自动解压。
  3. 我们可以手动设置"Accept-Encoding"字段,来解除针对gzip的默认行为(例如,不会进行自动解压)。
  4. 在Android4.4以后底层是由OkHttp实现的,所以4.4之后的版本,Content-Length被移除,getContentLength()为 -1。(2.3-4.3之间为压缩后数据的大小)

OkHttp的gzip压缩

  1. OkHttp是默认支持gzip解压缩的,不需要额外配置。
  2. 默认情况下,OkHttp在处理请求结果时,会对结果进行自动解压处理。
  3. 自动解压时移除Content-Length,所以上层代码想要contentLength时为-1
  4. 我们可以手动设置"Accept-Encoding"字段,来解除OkHttp自动对gzip的相关处理。
  5. 手动手动设置"Accept-Encoding"字段,OkHttp不负责对返回数据的解压缩。
gzip 是GNUzip的缩写,它是一个GNU自由软件的文件 压缩 程序。 HTTP 协议上的 GZIP 编码是一种用来改进WEB应用程序性能的技术。一般服务器 都安装有这个功能模块的,服务器端不需做改动。 当浏览器支持 gzip 格式的时候, 服务器端会 传输 gzip 格式的数据。 从 Http 技术细节上讲,就是 http request 头 有 “Accept-Encoding”, “ gzip ” ,response 就有返回头Content-Encoding= gzip 我们现在从浏览器上访问玩啥网站都是 gzip 格式 传输 的。 但是我们现在 Android 客户端,没有用
Gzip http 数据 传输 ,body 压缩 。节省流量 Android 开发 网络 请求的 压缩 ── GZip 使用 http client对post内容 gzip 压缩 和server端解压接收 Android 使用 gzip 传递数据以上是参考资料下面是我测试效果fiddler 抓包代码public static void reqeust(String pUrl) { URL url;
源码ok http HTTP 是现代 网络 程序的数据 传输 协议,它展示设备和服务器之间是如何 传输 数据和媒体文件。高效的 使用 HTTP 协议可以让你的应用运行的更快、节省更多流量。OK HTTP 应运而生,它是Square的一个开源库。 OK HTTP 具有如下特性: 1.支持SPDY,在主机上共享一个Socket处理所有请求。 2. 使用 连接池来减少请求延迟(当SPDY不可用的情况下)。 3.无缝的支持 GZIP 以减少下载量。 4.超高速缓存避免重复的请求。 OK HTTP 能够处理很多 网络 问题:自动修复很多常用的连接问题。如果你的服务拥有多个IP地址,一旦第一个连接失败,OK HTTP 使用 其他的备份地址,对于处理驻留在冗余数据 心的IPV4+IPV6和托管服务,这是必备的技术。OK HTTP 还能修复有问题的代理服务器和失败的SSL握手问题。 不需要额外编写 网络 代码即可在您的程序 使用 OK HTTP 。OK HTTP 实现了类似于iava.net. Http URLConnection API的核心模块,另外ok http -apache模块实现了Apache Http client API。 OK HTTP 支持 Android 2.2及以上版本,对于 JAVA ,则需要 JAVA 1.5以上。
gzip 是一种数据格式,默认且目前仅 使用 deflate算法 压缩 data部分; Gzip 是一种流行的文件 压缩 算法,现在的应用十分广泛,尤其是在Linux平台。当应用 Gzip 压缩 到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。这取决于文件 的内容。       利用Apache Gzip 模块,我们可以 使用 Gzip 压缩 算法来对Apache服务器发布的
请求 压缩 :请求时 使用 GZIP OutputStream对数据进行 压缩 处理响应时 使用 GZIP InputStream对数据进行解 压缩 处理    public static byte[] compress(String str) throws IOException { try (ByteArrayOutputStream out = new ByteArrayOutputStream()...
public static final String GZIP _ENCODE_UTF_8 = "UTF-8"; public static final String GZIP _ENCODE_ISO_8859_1 = "ISO-8859-1"; private static final char ARRAY_LEFT = ...
Ok Http 包的设计和实现的首要目标是高效。这也是选择 Ok Http 的重要理由之一。Ok Http 提供了对最新的 HTTP 协议版本 HTTP /2 和 SPDY 的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。如果 HTTP /2 和 SPDY 不可用,Ok Http 使用 连接池来复用连接以提高效率。Ok Http 提供了对 GZIP 的默认支持来降低 传输 内容的大小。Ok Http 也提供了对 HTTP 响应的缓存机制,可以避免不必要的 网络 请求。当 网络 出现问题时,Ok Http 会自动重试一个主机的多个 IP 地址。 (Ok Http 的GitHub主页: http s://githu
http 是现在主流应用 使用 网络 请求方式, 用来交换数据和内容, 有效的 使用 HTTP 可以使你的APP 变的更快和减少流量的 使用 Ok Http 是一个很棒 HTTP 客户端(GitHub主页: http s://github.com/square/ok http ): 支持SPDY, 可以合并多个到同一个主机的请求 使用 连接池技术减少请求的延迟(如果SPDY是可用的话) 使用 GZIP 压缩 减少 传输 的数据量 缓存响应避免重复的 网络 请求 当你的 网络 出现拥挤的时候,就是OK Http 大显身手的时候, 它可以避免常见的 网络 问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败, OkHT
接下来,让我解说一下如何在 Android 系统 使用 gzip 进行数据传递 HTTP 协议上的 GZIP 编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常 使用 GZIP 压缩 技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过 网络 传输 文件时,可以减少 传输 的时间。作者在写这篇博客时经过测试,4.4MB的文本数据经过 Gzip 传输 到客户端之后变为392KB, 压缩 效率极高。 一.服务端 服务端有2种方式去 压缩 ,一种可以自己 压缩 ,但是更推荐第二种方式,用PrintWriter作为输出流,工具类代码如下 代码如下: /** * 判断浏览器是否支持 gzip 压缩 * @p
http .createServer(function (req, res) { // 获取Accept-Encoding头 var encoding = req.headers['accept-encoding']; // 如果浏览器支持 gzip 压缩 if (encoding.indexOf(' gzip ') >= 0) { res.writeHead(200, { 'Content-Encoding': ' gzip ' }); // 对响应内容进行 gzip 压缩 var gzip = zlib.create Gzip (); fs.createReadStream('file.txt').pipe( gzip ).pipe(res); } else { res.writeHead(200, {}); fs.createReadStream('file.txt').pipe(res); }).listen(3000); 在这段代码 ,首先获取浏览器发送的"Accept-Encoding"请求头,然后检查是否支持 gzip 压缩 。如果浏览器支持 gzip 压缩 ,则设置响应头"Content-Encoding"为" gzip ",并 使用 zlib模块的create Gzip ()方法对响应内容进行 gzip 压缩 。如果浏览器不支持 gzip 压缩 ,则直接将文件内容发送给浏览器。