软件发布| 专题库| 优优资讯| 苹果专区| 安卓专区| 软件下载| 首页
优优资讯 电脑教程 安卓教程 安卓攻略 苹果教程 苹果攻略 新闻资讯

iOS开发ASIHTTPRequest数据压缩和Cookie的使用

时间:2015-09-28 来源:本站整理 我要评论

  数据压缩
 
  使用gzip来处理压缩的响应数据
 
  从0.9版本开始,ASIHTTPRequest会提示服务器它可以接收gzip压缩过的数据。许多web服务器可以在数据被发送之前压缩这些数据——这可以加快下载速度减少流量使用,但会让服务器的cpu(压缩数据)和客户端(解压数据)付出代价。总的来说,只有特定的几种数据会被压缩——许多二进制格式的文件像jpeg,gif,png,swf和pdf已经压缩过他们的数据了,所以向客户端发送这些数据时不会进行gzip压缩。文本文件例如网页和xml文件会被压缩,因为它们通常有大量的数据冗余。
 
  怎样设置apache的mod_deflate来使用gzip压缩数据
 
  apache 2.x以上版本已经配备了mod_deflate扩展,这使得apache可以透明地压缩特定种类的数据。要开启这个特性,你需要在apache的配置文件中启用mod_deflate。并将mod_deflate命令添加到你的虚拟主机配置或者.htaccess文件中。
 
  在ASIHTTPRequest中使用gzip
 
  - (IBAction)grabURL:(id)sender
  {
  NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  // 默认为YES, 你可以设定它为NO来禁用gzip压缩
  [request setAllowCompressedResponse:YES];
  [request startSynchronous];
  BOOL *dataWasCompressed = [request isResponseCompressed]; // 响应是否被gzip压缩过?
  NSData *compressedResponse = [request rawResponseData]; // 压缩的数据
  NSData *uncompressedData = [request responseData]; // 解压缩后的数据
  NSString *response = [request responseString]; // 解压缩后的字符串
  }
 
  当allowCompressedResponse 设置为YES时,ASIHTTPRequest将向request中增加一个Accept-Encoding头,表示我们可以接收gzip压缩过的数据。如果响应头中包含一个Content-Encoding头指明数据是压缩过的,那么调用responseData 或者responseString 将会得到解压缩后的数据。你也可以通过调用rawResponseData来获得原始未压缩的数据。
 
  相应数据的实时解压缩
 
  默认情况下,ASIHTTPRequest会等到request完成时才解压缩返回的数据。若设置request的shouldWaitToInflateCompressedResponses 属性为NO,ASIHTTPRequest将会对收到的数据进行实时解压缩。 在某些情况下,这会稍稍提升速度,因为数据可以在reqeust等待网络数据时进行处理。
 
  如果你需要对响应数据流进行流处理(例如XML和JSON解析),这个特性会很有用。如果启用了这个选项,你可以通过实现代理函数request:didReceiveData:来将返回的网络数据一点一点喂给解析器。
 
  注意,如果shouldWaitToInflateCompressedResponses 被设置为NO,那么原始(未解压)的数据会被抛弃。具体情况请查阅ASIHTTPRequest.h的代码注释。
 
  使用gzip压缩request数据
 
  1.0.3版本的新特性就是gzip压缩request数据。使用这个特性,你可以通过设置shouldCompressRequestBody 为YES来使你的程序压缩POST/PUT的内容,默认值为NO。
 
  apache的mod_deflate可以自动解压缩gzip压缩的请求体(通过合适的设置)。这个方法适用于CGI内容,但不适用于内容过滤器式的模块(例如mod PHP),这种情况下,你就必须自己解压缩数据。
 
  ASIHTTPRequest 无法检测一个服务器是否能接收压缩过的请求体。当你确定服务器可以解压缩gzip包时,再使用这个特性。
 
  请避免对已经压缩过的格式(例如jpeg/png/gif/pdf/swf)进行压缩,你会发现压缩后的数据比原数据更大。
 
  Cookie的使用
 
  持久化cookie
 
  ASIHTTPRequest允许你使用全局存储来和所有使用CFNetwork或者NSURLRequest接口的程序共享cookie。
 
  如果设置useCookiePersistence为YES(默认值),cookie会被存储在共享的 NSHTTPCookieStorage 容器中,并且会自动被其他request重用。值得一提的是,ASIHTTPRequest会向服务器发送其他程序创建的cookie(如果这些cookie对特定request有效的话)。
 
  你可以清空session期间创建的所有cookie:
 
  [ASIHTTPRequest setSessionCookies:nil];
 
  这里的‘session cookies’指的是一个session中创建的所有cookie,而非没有过期时间的cookie(即通常所指的会话cookie,这种cookie会在程序结束时被清除)。
 
  另外,有个方便的函数 clearSession可以清除session期间产生的所有的cookie和缓存的授权数据。
 
  自己处理cookie
 
  如果你愿意,你大可以关闭useCookiePersistence,自己来管理某个request的一系列cookie:
 
  //创建一个cookie
  NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
  [properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue];
  [properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName];
  [properties setValue:@".dreamingwish.com" forKey:NSHTTPCookieDomain];
  [properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
  [properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath];
  NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease];
  //这个url会返回名为'ASIHTTPRequestTestCookie'的cookie的值
  url = [NSURL URLWithString:@"http://www.dreamingwish.com/"];
  request = [ASIHTTPRequest requestWithURL:url];
  [request setUseCookiePersistence:NO];
  [request setRequestCookies:[NSMutableArray arrayWithObject:cookie]];
  [request startSynchronous];
  //将会打印: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie'
  NSLog(@"%@",[request responseString]);
 

用户评论

(已有0条评论)
表情
注:您的评论需要经过审核才能显示哦,请文明发言!
还没有评论,快来抢沙发吧!
快速检索
0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z