android在使用apache http类库的时候实现zip传输数据

在最近的项目里,我发现我们的客户端和服务器通信的数据量比较大,大约json的数据体在2M左右。

但是iOS的下载速度明显比android快很多。同样的网络环境下,理论上没有那么大的差别,因此我检查了一下项目代码,发现iOS用的ASIHTTP类,而android用的apache.http。

这2个都是首选的http类库,理论上不会造成性能大的差异,所以问题应该还是在传输的方式上。

通过检查,发现问题是在http传输的时候是否启用压缩的问题上。


对于服务器来说,配置压缩是很简单的事,那么是否真正实现了压缩,还是需要客户端做出响应的动作。

在http的请求header中,必须要明文出现,表明客户端可以处理压缩流

Accept-Encoding:gzip


如果服务器支持gzip,则会输出经过压缩的流

如果请求里没有这一句或者服务器不支持压缩,则服务器输出未经压缩的流

在服务器返回的response里,如果是经过压缩的流,则在response header里必然包含

Content-Encoding:gzip


iOS使用的asiHttp默认是在请求的头里包含了Accept-Encoding:gzip的(某个版本之后),而apache.http则默认没有包含该内容,因此我们需要对android的http调用做一些设置:

public static String basePostRequest(String urlString,
			HashMap<String, ContentBody> params) {
		CLIENT.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeoutConnection);
		CLIENT.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeoutSocket);
		//try {
			// 模拟Http Post请求
			HttpPost post = new HttpPost(urlString);
			post.addHeader("Accept-Encoding", "gzip");
			MultipartEntity reqEntity = new MultipartEntity();
			if (params != null) {
				Iterator<String> itParamsKey = params.keySet().iterator();
				while (itParamsKey.hasNext()) {
					String key = itParamsKey.next();
					ContentBody value = params.get(key);
					reqEntity.addPart(key, value);
				}
			}
			post.setEntity(reqEntity);
			HttpResponse response;
			try {
				response = CLIENT.execute(post);
				HttpEntity resEntity = response.getEntity();
				if(resEntity.getContentEncoding() != null && resEntity.getContentEncoding().getValue().contains("gzip")){
					Helper.log("gzip content");
					InputStream stream = new GZIPInputStream(resEntity.getContent());
					BufferedReader br = new BufferedReader(new InputStreamReader(stream));
			        String line = null;
			        StringBuffer sb = new StringBuffer();
			        while((line = br.readLine())!=null) {
			        	sb.append(line);
			        }
					return sb.toString();
				}else{
					return new String(EntityUtils.toByteArray(resEntity), "UTF-8");
				}
				
			} catch (Exception e) {
				return null;
			} 
	}

需要注意的是,有些人可能认为在request的header里包含了压缩支持之后就以为万事大吉了。事实上一旦服务器返回了压缩的流,客户端必须要做响应的处理。

因此代码里:

HttpEntity resEntity = response.getEntity();
				if(resEntity.getContentEncoding() != null && resEntity.getContentEncoding().getValue().contains("gzip")){
...
}

是对服务器是否支持压缩的判断,并且要通过GZIPInputStream来解压缩流。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值