zoukankan      html  css  js  c++  java
  • ASIHTTPRequest中数据压缩问题与gzip

    出现了类似问题,先mark,以后修改

     

    最近使用asi发现,部分网络回调数据不能正常的json解析,将responseHeaders头打印出来,才发现公司服务器部分数据添加了gzip压缩传输。

    最近简单的解决方法就是,设置网络请求不返回压缩数据,自动解压就ok了。
    [request setAllowCompressedResponse:NO];
     
    -----------------------------------------------------------------
    -----------------------------------------------------------------

    使用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

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    - (IBAction)grabURL:(id)sender
    {
    NSURL *url = [NSURL URLWithString:@"http://www.cccsee.cn"];
    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),这种情况下,你就必须自己解压缩数据。

  • 相关阅读:
    第四次作业
    第二次上机作业
    5.21上机作业
    第十一周课后作业
    第十一周上机练习
    第10周java作业
    第9次上级联系
    第8周作业
    第八周上机练习
    第七周作业
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/5216301.html
Copyright © 2011-2022 走看看