HTTP协议上的GZIP编码 是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储 空间,二是通过网络传输文件时,可以减少传输的时间。作者在写这篇博客时经过测试,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高。
一.服务端
服务端有2种方式去压缩,一种可以自己压缩,但是更推荐第二种方式,用PrintWriter作为输出流,工具类代码如下:
[java]
/**
* 判断浏览器是否支持 gzip 压缩
* @param req
* @return boolean 值
*/
public static boolean isGzipSupport(HttpServletRequest req) {
String headEncoding = req.getHeader("accept-encoding");
if (headEncoding == null || (headEncoding.indexOf("gzip")
== -1)) { // 客户端 不支持 gzip
return false;
} else { // 支持 gzip 压缩
return true;
}
}
/**
* 创建 以 gzip 格式 输出的 PrintWriter 对象,如果浏览器不支持
gzip 格式,则创建普通的 PrintWriter 对象,
* @param req
* @param resp
* @return
* @throws IOException
*/
public static PrintWriter createGzipPw(HttpServletRequest req,
HttpServletResponse resp) throws IOException {
PrintWriter pw = null;
if (isGzipSupport(req)) { // 支持 gzip 压缩
pw = new PrintWriter(new GZIPOutputStream
(resp.getOutputStream()));
// 在 header 中设置返回类型为 gzip
resp.setHeader("content-encoding", "gzip");
} else { // // 客户端 不支持 gzip
pw = resp.getWriter();
}
return pw;
}
servlet代码如下:
[java]
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Encoding", "gzip");
String ret = "{\"ContentLayer\":{\"title\":\"内容层\"},
\"PageLink\":{\"title\":\"页面跳转\"},\"WebBrowser\":{\"title\":\
"浏览器\"},"
+ "\"InlinePage\":{\"title\":\"内嵌页面\"},\"VideoComp
\":{\"title\":\"视频\"},"
+ "\"PopButton\":{\"title\":\"内容开关\"},\"ZoomingPic
\":{\"title\":\"缩放大图\"},"
+ "\"Rotate360\":{\"title\":\"360度旋转\"}}";
PrintWriter pw = new PrintWriter(new GZIPOutputStream
(response.getOutputStream()));
pw.write(ret);
pw.close();
}
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
this.doPost(request, response);
}
在代理软件中跟踪到的数据如下:
[plain]
‹«VrÎÏ+IÍ+ñI¬L-R²ªV*É,ÉIU²R:rëÄÝM•ju”ÓS}2ó²‘e/m>üìÌë«@òá©INEùåŨúŸ¬?
pàØw¼g^Nf^*ÈTóo™R–™’šïœŸ[€¬àÔåc[ÁÖç8•–”äç¡»nÿª7@
¢òós3óÒ2“‘Uœþºýè–Ïg÷€Tå—$–¤› +r·¸ðä‡Zh¤†ˆ
实际数据如下:
[java]
{"ContentLayer":{"title":"内容层"},"PageLink":{"title":"页面跳转"},
"WebBrowser":{"title":"浏览器"},"InlinePage":{"title":"内嵌页面"},
"VideoComp":{"title":"视频"},"PopButton":{"title":"内容开关"},
"ZoomingPic":{"title":"缩放大图"},"Rotate360":{"title":"360度旋转"
}}
二.Android客户端
得到HttpClient代码:
[java]
private static DefaultHttpClient getHttpClient() {
DefaultHttpClient httpClient = new DefaultHttpClient();
// 设置 连接超时时间
httpClient.getParams().setParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIMEOUT_
CONNECTION);
// 设置 读数据超时时间
httpClient.getParams().setParameter(HttpConnectionParams.
SO_TIMEOUT,
TIMEOUT_SOCKET);
// 设置 字符集
httpClient.getParams().setParameter("http.protocol.
content-charset",
UTF_8);
return httpClient;
}
得到HttpPost:
[java]
private static HttpPost getHttpPost(String url) {
HttpPost httpPost = new HttpPost(url);
// 设置 请求超时时间
httpPost.getParams().setParameter(HttpConnectionParams.SO_
TIMEOUT,
TIMEOUT_SOCKET);
httpPost.setHeader("Connection", "Keep-Alive");
httpPost.addHeader("Accept-Encoding", "gzip");
return httpPost;
}
访问网络代码:
[java]
public static InputStream http_post_return_byte(String url,
Map<String, String> params) throws AppException {
DefaultHttpClient httpclient = null;
HttpPost post = null;
HttpResponse response = null;
StringBuilder sb = null;
StringEntity stringEntity = null;
try {
httpclient = getHttpClient();
post = getHttpPost(url);
sb = new StringBuilder();
if (params != null && !params.isEmpty()) {
Logger.d("In http_post the url is get here");
for (Entry<String, String> entry : params.
entrySet()) {
sb.append(entry.getKey())
.append("=")
.append(URLEncoder.encode(entry.
getValue(),
HTTP.UTF_8)).append("&");
}
sb.deleteCharAt(sb.lastIndexOf("&"));
Logger.d("In http_post the url is " + url + " and
params is "
+ sb.toString());
stringEntity = new StringEntity(sb.toString());
stringEntity
.setContentType
("application/x-www-form-urlencoded");
post.setEntity(stringEntity);
}
response = httpclient.execute(post);
int statusCode = response.getStatusLine().
getStatusCode();
Logger.d("statusCode is " + statusCode);
if (statusCode != HttpStatus.SC_OK) {
throw AppException.http(statusCode);
}
InputStream is = response.getEntity().getContent();
Header contentEncoding = response
.getFirstHeader("Content-Encoding");
if (contentEncoding != null
&& contentEncoding.getValue().
equalsIgnoreCase("gzip")) {
is = new GZIPInputStream(new BufferedInputStream
(is));
}
return is;
} catch (ClientProtocolException e) {
e.printStackTrace();
throw AppException.http(e);
} catch (IOException e) {
e.printStackTrace();
throw AppException.network(e);
} finally {
/*
* if (!post.isAborted()) {
*
* post.abort(); } httpclient = null;
*/
}
}
更多android技术问题欢迎加群探讨:314230976,验证码:csl,不写验证不予通过。
分享到:
相关推荐
接下来,让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一...
gzip压缩源代码,由java语言编写,里面有个ZipUtil类,其中有两个静态方法可以方便调用用来压缩和解压缩。该包可以用于j2me和android程序中。
gzip源代码gzip源代码gzip源代码
VC6 gzip 压缩解压 测试代码 使用gzip.dll windows2003自带的gzip库,用于网络数据传输的压缩解压,兼容目前所有的网络服务器
使用C语言编写的GZIP压缩及解压源代码
Android GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序。 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动。 当浏览器支持...
OmegaGZipInterceptor helper unziping files from server Installation To get a Git project into your build: Step 1. Add the JitPack repository to your build file allprojects { repositories { ...
易语言GZIP数据解压缩源码,GZIP压缩,GZIP解压,InitDecompression,InitCompression,CreateDecompression,CreateCompression,ResetDecompression,ResetCompression,DestroyDecompression,DeInitCompression,...
一个Delphi的Gzip解压示例,内附完整源代码,在解压路上不迷路,本人已亲测可用,欢迎下载使用,有疑问请联系本人
数据请求 GZip数据压缩和解压缩问题
使用gzip压缩,能够减少数据传输大小,加快网页或APP加载速度。很多大站都开启了gzip压缩,不过也有很多网站并没有开启gzip压缩,本文档使用截图和文字的方式详细讲解了压缩数据的配置和过程,希望对您有益!
文件和文件流操作,使用GZip解压文件。 您可以通过代码加压压缩的文档
代码采用VS2008开发,使用.net framework2.0,如果你需要用VS2005开发,把文件依次COPY过去即可。 什么是网页GZIP压缩? 这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能...
zlib解压 http的gzip数据解压
firefox里gzip的c++源代码 可以学习一下哦
(1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查; 支持事务,默认关闭; 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); ...
RedBit.Samples.XPlat.GZip 使用 Xamarin Forms for iOS、Android 和 Windows Phone 的 GZip 压缩和 HttpClient 的示例代码。 配套文章可以在找到
基于google Android网络请求库Volley最新源码,增加gzip数据处理方式,支持gzip格式数据返回的数据解压。
ajax+pako.js实现gzip数据压缩上传,解决post数据过长问题 http://blog.csdn.net/jodenhe/article/details/70983781