iOS開發ASIHTTPRequest資料壓縮和Cookie的使用

來源:互聯網
上載者:User

   資料壓縮

  使用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]);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.