使用iOS SDK中的HTTP網(wǎng)絡(luò)請求API,相當?shù)膹碗s,調(diào)用很繁瑣,ASIHTTPRequest就是一個對CFNetwork API進行了封裝,并且使用起來非常簡單的一套API,用Objective-C編寫,可以很好的應用在Mac OS X系統(tǒng)和iOS平臺的應用程序中。ASIHTTPRequest適用于基本的HTTP請求,和基于REST的服務之間的交互。
ASIHTTPRequest功能很強大
主要特色如下:
l 通過簡單的接口,即可完成向服務端提交數(shù)據(jù)和從服務端獲取數(shù)據(jù)的工作
l 下載的數(shù)據(jù),可存儲到內(nèi)存中或直接存儲到磁盤中
l 能上傳本地文件到服務端
l 可以方便的訪問和操作請求和返回的Http頭信息
l 可以獲取到上傳或下載的進度信息,為應用程序提供更好的體驗
l 支持上傳或下載隊列,并且可獲取隊列的進度信息
l 支持基本、摘要和NTLM身份認證,在同一會話中授權(quán)憑證會自動維持,并且可以存儲在Keychain(Mac和iOS操作系統(tǒng)的密碼管理系統(tǒng))中
l 支持Cookie
l 當應用(iOS 4+)在后臺運行時,請求可以繼續(xù)運行
l 支持GZIP壓縮數(shù)據(jù)
l 內(nèi)置的ASIDownloadCache類,可以緩存請求返回的數(shù)據(jù),這樣即使沒有網(wǎng)絡(luò)也可以返回已經(jīng)緩存的數(shù)據(jù)結(jié)果
l ASIWebPageRequest –可以下載完整的網(wǎng)頁,包括包含的網(wǎng)頁、樣式表、腳本等資源文件,并顯示在UIWebView /WebView中。任意大小的頁面都可以無限期緩存,這樣即使沒有網(wǎng)絡(luò)也可以離線瀏覽
l 支持客戶端證書
l 支持通過代理發(fā)起Http請求
l 支持帶寬限制。在iOS平臺,可以根據(jù)當前網(wǎng)絡(luò)情況來自動決定是否限制帶寬,例如當使用WWAN(GPRS/Edge/3G)網(wǎng)絡(luò)時限制,而當使用WIFI時不做任何限制
l 支持斷點續(xù)傳
l 支持同步和異步請求
使用說明
ASIHTTPRequest有很多功能,所有功能說明都可以在其官方網(wǎng)站的相關(guān)文檔中查到,限于篇幅,本章僅簡單介紹一下如何使用ASIHTTPRequest來進行同步Http請求和異步Http請求。在后面的章節(jié)中,我們還會用到它的一些其他功能。
在使用ASIHTTPRequest之前,請確認已經(jīng)正確安裝,然后在需要應用它的代碼文件頭部,加入:
#import “ASIHTTPRequest.h”
這樣就可以在代碼中使用ASIHTTPRequest相關(guān)的類。
創(chuàng)建一個同步請求
這是ASIHTTPRequest最簡單的一種使用模式,發(fā)送startSynchronous消息后即開始在同一線程中執(zhí)行HTTP請求,線程將一直等待直到請求結(jié)束(請求成功或者失敗)。通過檢查error屬性可以判斷請求是否成功或者有錯誤發(fā)生。
要獲取返回的文本信息,調(diào)用responseString方法。如果下載的是二進制文件,例如圖片、MP3,則調(diào)用responseData方法,可以得到一個NSData對象。
- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}
一般情況下,應該優(yōu)先使用異步請求代替同步請求,當在主線程中使用ASIHTTPRequest同步請求,應用程序的界面會鎖定,無法進行任何操作,直到請求完成。
創(chuàng)建一個異步請求
上例中的同步請求,如果換成異步方式來調(diào)用,請求是在后臺線程中運行,當請求執(zhí)行完后再通知調(diào)用的線程。這樣不會導致主線程進行網(wǎng)絡(luò)請求時,界面被鎖定等情況。
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
// 當以文本形式讀取返回內(nèi)容時用這個方法
NSString *responseString = [request responseString];
// 當以二進制形式讀取返回內(nèi)容時用這個方法
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}