iOS与服务器端 GZip压缩问题
昨天搞了一天的GZip压缩,试了三种方式(libz库,ZipArchive,ASIHttpRequest),一开始都不成功。
理论上三个应该都能用的,但我都不行。等我试到第三种方式的时候才知道,不是我的问题,而是后台的问题(Java端输出方式一会再说)。
今天就总结一下,写写iOS与Java服务器获取压缩数据的方法吧。
一、客户端-服务端数据压缩解压流程(ASIHttpRequest)客户端生成request,
设置header允许使用压缩("Accept-Encoding","gzip"),即是告诉服务器,
客户端支持压缩,但凡可以压缩的服务器,尽管来吧!服务器收到这个header,
如果它支持压缩,可以通过压缩方式输出数据,
然后再写入response的header("Content-Encoding","gzip")
1.以ASIHttpRequest为例,代码如下:
NSURL* requestURL = [NSURL URLWithString:_listURL];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:requestURL];
// 默认为YES, 你可以设定它为NO来禁用gzip压缩 [request setAllowCompressedResponse:YES];
[request setDelegate:self];
[request startAsynchronous];
如果是普通的URLRequest,只要: request.setHeader("Accept-Encoding","gzip");
2.服务器端返回: response.setHeader("Content-Encoding","gzip");
3.客户端响应,同样以ASIHttpRequest为例(此例传输的是json数据,我还使用了SBJson解析一下):
- (void)requestFinished:(ASIHTTPRequest *)request{
NSString *jsonString = @"";
SBJsonParser* jsonParser = [[SBJsonParser alloc] init];
NSMutableDictionary *jsonDictionary = nil;
BOOL dataWasCompressed = [request isResponseCompressed]; // 响应是否被gzip压缩过?
if (dataWasCompressed)
{
NSData *uncompressedData = [request responseData];
// 解压缩后的数据
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
jsonString = [[NSString alloc]initWithData:uncompressedData encoding:enc];
jsonDictionary = [jsonParser objectWithString:jsonString error:nil];
[jsonString release];
}else {
jsonString = [request responseString];
jsonDictionary = [jsonParser objectWithString:jsonString error:nil];
}
self._tableDict = jsonDictionary;
[jsonParser release];
[self loadTableDict];
[self release];
}
附上一篇非常详细的ASIHttpRequest请求Json数据教程(无GZip相关内容):
http://ios-blog.co.uk/articles/tutorials/parsing-json-on-ios-with-asihttprequest-and-sbjson/
libz库 libz库是官方的一个库,貌似ASIHttpRequest也是用这个库解压的,当我们获得压缩过的data数据以后(方法与上面类似,
只是获得了普通的data数据响应),可以使用这种方法解压数据,解压方法如下所示(如果仅仅放在当前类下面使用,传个data参数进来,
然后把self换成变量名):
#include @implementation NSData (DDData)
- (NSData *)gzipInflate {
if ([self length] == 0)
return self;
unsigned full_length = [self length];
unsigned half_length = [self length] / 2;
NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length]; BOOL done = NO;
int status;
z_stream strm;
strm.next_in = (Bytef *)[self bytes];
strm.avail_in = [self length];
strm.total_out = 0; strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
if (inflateInit2(&strm, (15+32)) != Z_OK) return nil; while (!done) { // Make sure we have enough room and reset the lengths.
if (strm.total_out >= [decompressed length])
[decompressed increaseLengthBy: half_length]; strm.next_out = [decompressed mutableBytes] + strm.total_out;
strm.avail_out = [decompressed length] - strm.total_out;
// Inflate another chunk. status = inflate (&strm, Z_SYNC_FLUSH);
if (status == Z_STREAM_END)
done = YES;
else if (status != Z_OK)
break;
}
if (inflateEnd (&strm) != Z_OK) return nil;
// Set real length.
if (done) {
[decompressed setLength: strm.total_out];
return [NSData dataWithData: decompressed];
} else
return nil;
}
附上一篇非常详细的libz库压缩教程 http://www.clintharris.net/2009/how-to-gzip-data-in-memory-using-objective-c/
以及压缩解压教程(代码从这里拷贝的): http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html
ZipArchive 上面讲的都是Memory压缩与解压,ZipArchive主要是对文档进行处理。昨天在上述方法不成功的情况下,我把获取的data数据
save to file,然后再处理,理论上是可行的,但是由于服务器有误,获取的数据不对,所以我怎么都解压不成功!!!!
示例如下:
Objective-C class used to zip / unzip compressed zip file.
Usage: Add all the files to you project, and and framework libz.1.2.3.dylib. include ZipArchive.h
using #import "ZipArchive/ZipArchive.h" *
create zip file ZipArchive* zipFile = [[ZipArchive alloc] init];
[zipFile CreateZipFile2:@"zipfilename"]; // A OR [[zipFile CreateZipFile2:@"zipfilename" Password:@"your password"];
// if password needed, //empty password will get same result as A [zipFile addFileToZip:@"fullpath of the file" newname:@"new name of the file without path"];
// ....add any number of files here
[zipFile CloseZipFile2];
[zipFile release]; // remember to release the object * unzip compressed file
ZipArchive* zipFile = [[ZipArchive alloc] init];
[zipFile UnzipOpenFile:@"zip file name"]; // B (the zip got no password) OR [zipFile UnzipOpenFile:@"zip file name" Password:@"password" ];
[zipFile UnzipFileTo:@"output path" overwrite:YES];
[zipFile UnzipCloseFile];
[zipFile release];
iOS与服务器端 GZip压缩问题的更多相关文章
- 专业术语:闭包、网站优化 Gzip 服务器端文件压缩
1, 闭包:http://baike.baidu.com/view/648413.htm 2, 网站优化 Gzip 服务器端文件压缩 http://baike.baidu.com/view/96662 ...
- GZIP压缩优化
使用gzip优化web应用(filter实现) 相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户 ...
- Nginx 开启gzip 压缩
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-ZIP)是一种压缩技术. 经过gz ...
- thttpd增加gzip压缩响应报文体功能,以减少传输数据量
thttpd thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Z ...
- apache启用gzip压缩方法--转载自http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html
一.gzip介绍 Gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台.当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小.这取决于文件中 ...
- Nginx Gzip 压缩配置
Nginx Gzip 压缩配置 随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-Z ...
- gzip压缩JavaScript
为了提高客户端的体验效果,RIA开发逐渐兴起.这样会项目中会充斥的大量的JavaScript代码,与此同时会消耗客户端浏览器性能.对于 Ext 实现的 one page one application ...
- Tomcat启用Gzip压缩
原理简介 HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并 浏览.相对于普通的 ...
- 【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存
gzip压缩 概述 网页在服务器端经过了gzip或者其他格式的压缩后的输出明显减少了content-length字节,当访问过百万时,这些减少的字节就会变为客观的流量给节约下来;从而减轻服务器的压力以 ...
随机推荐
- WebSocket学习笔记IE,IOS,Android等设备的兼容性问
WebSocket学习笔记IE,IOS,Android等设备的兼容性问 一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏 ...
- Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 563 Solved: 274[Submit][ ...
- db2 identity列重置,reset/restart
db2中可以对表中的某一个列创建identity列,用于自动填充值,某些情况下(比如删除数据后,需要从最小值开始,并不重复,那可以对标识列进行reset操作) 语法: ALTER TABLE < ...
- CentOS 7下安装xampp和testlink
记录一下最近安装testlink的经历,供大伙儿参考,有问题可以留言讨论,这里就不截图了 先说下安装版本: CentOS-7.0-1406-x86_64-DVDxampp-linux-1.8.3-5- ...
- PAT 1026. Table Tennis
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For ...
- Java类加载机制深度分析
转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...
- 使用泛型简单封装NGUI的ScrollView实现滑动列表
懒,是老毛病了,周末跑了半马,跑完也是一通累,好久没锻炼了..也是懒的,有时都懒的写博客..最近看到项目中各种滑动列表框,本着要懒出水平来的原则,决定花点时间简单处理下(暂时未做列表太多时的优化):1 ...
- spring applicationContext.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- iOS 7 新版微信 URL 不支持跳转 App Store 的解决方案
今天早上刚到公司,就收到反馈说公司前端页面的下载按钮在 iOS 7 的微信内置浏览器里面点击无效,经过确认之后,前端代码是正常的,问题出在了微信上,然后谷歌之,原来腾讯在***. 是 BUG 还是刻意 ...
- css3 -> 多栏布局
在进行多栏布局时.使用bootstrap的栅格系统能够非常轻松的实现效果,事实上css3本身也提供了多兰布局的功能. 比方,我们在一个section标签内填充了非常多内容.同一时候希望内容可以显示成三 ...