android在使用apache http类库的时候实现zip传输数据
2013-04-12 09:32
651 查看
在最近的项目里,我发现我们的客户端和服务器通信的数据量比较大,大约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调用做一些设置:
需要注意的是,有些人可能认为在request的header里包含了压缩支持之后就以为万事大吉了。事实上一旦服务器返回了压缩的流,客户端必须要做响应的处理。
因此代码里:
是对服务器是否支持压缩的判断,并且要通过GZIPInputStream来解压缩流。
但是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来解压缩流。
相关文章推荐
- 使用python2实现http multipart/form-data数据传输
- 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩
- 关于Android使用HttpURLConnection传输含有中文JSON数据的报错、乱码问题
- Android HTTP实例 使用GET方法和POST方法发送请求(通过Apache接口实现)
- android(21)(使用HttpURLConnection,HttpClient和AsyncHttpClient分别实现post和get请求数据)
- 使用httpclient实现上传下载(javaWeb系统数据传输http实现)
- 使用python实现http及ftp服务进行数据传输的方法
- 使用httpclient实现上传下载(javaWeb系统数据传输http实现)
- Android中如何使用HttpURLConnection实现GET POST JSON数据
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android 使用蓝牙技术实现终端间数据传输
- 使用开源框架android-async-http-1.4.8.jar与服务器传输数据
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- 使用org.apache.tools.zip实现zip压缩和解压 http://wintys.blog.51cto.com/425414/90878
- Android-网络请求数据使用apache httpclient v4
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android中如何使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android与Java 服务器使用Socket协议实现Json数据传输
- 使用httpclient实现上传下载(javaWeb系统数据传输http实现)