一逗嫡、什么是ASIHTTPRequest
使用iOS SDK中的HTTP網(wǎng)絡(luò)請(qǐng)求API锦茁,相當(dāng)?shù)膹?fù)雜炫隶,調(diào)用很繁瑣存璃,ASIHTTPRequest就是一個(gè)對(duì)CFNetwork API進(jìn)行了封裝仑荐,并且使用起來(lái)非常簡(jiǎn)單的一套API,用Objective-C編寫纵东,可以很好的應(yīng)用在Mac OS X系統(tǒng)和iOS平臺(tái)的應(yīng)用程序中粘招。ASIHTTPRequest適用于基本的HTTP請(qǐng)求,和基于REST的服務(wù)之間的交互偎球。
二洒扎、ASIHTTPRequest功能
○l 通過(guò)簡(jiǎn)單的接口,即可完成向服務(wù)端提交數(shù)據(jù)和從服務(wù)端獲取數(shù)據(jù)的工作
○l 下載的數(shù)據(jù)衰絮,可存儲(chǔ)到內(nèi)存中或直接存儲(chǔ)到磁盤中
○l 能上傳本地文件到服務(wù)端
○l 可以方便的訪問和操作請(qǐng)求和返回的Http頭信息
○l 可以獲取到上傳或下載的進(jìn)度信息袍冷,為應(yīng)用程序提供更好的體驗(yàn)
○l 支持上傳或下載隊(duì)列,并且可獲取隊(duì)列的進(jìn)度信息
○l 支持基本猫牡、摘要和NTLM身份認(rèn)證胡诗,在同一會(huì)話中授權(quán)憑證會(huì)自動(dòng)維持,并且可以存儲(chǔ)在Keychain(Mac和iOS操作系統(tǒng)的密碼管理系統(tǒng))中
○l 支持Cookie
○l 當(dāng)應(yīng)用(iOS 4+)在后臺(tái)運(yùn)行時(shí),請(qǐng)求可以繼續(xù)運(yùn)行
○l 支持GZIP壓縮數(shù)據(jù)
○l 內(nèi)置的ASIDownloadCache類煌恢,可以緩存請(qǐng)求返回的數(shù)據(jù)骇陈,這樣即使沒有網(wǎng)絡(luò)也可以返回已經(jīng)緩存的數(shù)據(jù)結(jié)果
○l ASIWebPageRequest –可以下載完整的網(wǎng)頁(yè),包括包含的網(wǎng)頁(yè)瑰抵、樣式表你雌、腳本等資源文件,并顯示在UIWebView /WebView中二汛。任意大小的頁(yè)面都可以無(wú)限期緩存婿崭,這樣即使沒有網(wǎng)絡(luò)也可以離線瀏覽
○l 支持客戶端證書
○l 支持通過(guò)代理發(fā)起Http請(qǐng)求
○l 支持帶寬限制。在iOS平臺(tái)习贫,可以根據(jù)當(dāng)前網(wǎng)絡(luò)情況來(lái)自動(dòng)決定是否限制帶寬逛球,例如當(dāng)使用WWAN(GPRS/Edge/3G)網(wǎng)絡(luò)時(shí)限制,而當(dāng)使用WIFI時(shí)不做任何限制
○l 支持?jǐn)帱c(diǎn)續(xù)傳
○l 支持同步和異步請(qǐng)求
三苫昌、ASIHTTPRequest使用
ASIHTTPRequest是一款極其強(qiáng)勁的HTTP訪問開源項(xiàng)目颤绕。讓簡(jiǎn)單的API完成復(fù)雜的功能,
如:
異步請(qǐng)求祟身,隊(duì)列請(qǐng)求奥务,GZIP壓縮,緩存袜硫,斷點(diǎn)續(xù)傳氯葬,進(jìn)度跟蹤,上傳文件婉陷,HTTP認(rèn)證
在新的版本中帚称,還加入了Objective-C閉包Block的支持,讓我們的代碼更加輕簡(jiǎn)靈活秽澳。
△下面就舉例說(shuō)明它的API用法闯睹。
發(fā)起一個(gè)同步請(qǐng)求
同步意為著線程阻塞,在主線程中使用此方法會(huì)使應(yīng)用Hang住而不響應(yīng)任何用戶事件担神。所以楼吃,在應(yīng)用程序設(shè)計(jì)時(shí),大多被用在專門的子線程增加用戶體驗(yàn)妄讯,或用異步請(qǐng)求代替孩锡。
- (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];
}
}
a, 用requestWithURL快捷方法獲取ASIHTTPRequest的一個(gè)實(shí)例
b, startSynchronous 方法啟動(dòng)同步訪問,
c, 由于是同步請(qǐng)求亥贸,沒有基于事件的回調(diào)方法躬窜,所以從request的error屬性獲取錯(cuò)誤信息。
d, responseString炕置,為請(qǐng)求的返回NSString信息荣挨。
創(chuàng)建一個(gè)異步請(qǐng)求
異步請(qǐng)求的好處是不阻塞當(dāng)前線程溜族,但相對(duì)于同步請(qǐng)求略為復(fù)雜,至少要添加兩個(gè)回調(diào)方法來(lái)獲取異步事件垦沉。
下面異步請(qǐng)求代碼完成上面同樣的一件事情:
- (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
{
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
a,與上面不同的地方是指定了一個(gè) "delegate"仍劈,并用startAsynchronous來(lái)啟動(dòng)網(wǎng)絡(luò)請(qǐng)求厕倍。
b,在這里實(shí)現(xiàn)了兩個(gè)delegate的方法贩疙,當(dāng)數(shù)據(jù)請(qǐng)求成功時(shí)會(huì)調(diào)用requestFinished讹弯,請(qǐng)求失敗時(shí)(如網(wǎng)絡(luò)問題或服務(wù)器內(nèi)部錯(cuò)誤)會(huì)調(diào)用requestFailed。
隊(duì)列請(qǐng)求
提供了一個(gè)對(duì)異步請(qǐng)求更加精準(zhǔn)豐富的控制这溅。
如组民,可以設(shè)置在隊(duì)列中,同步請(qǐng)求的連接數(shù)悲靴。往隊(duì)列里添加的請(qǐng)求實(shí)例數(shù)大于maxConcurrentOperationCount時(shí)臭胜,請(qǐng)求實(shí)例將被置為等待,直到前面至少有一個(gè)請(qǐng)求完成并出列才被放到隊(duì)列里執(zhí)行癞尚。
也適用于當(dāng)我們有多個(gè)請(qǐng)求需求按順序執(zhí)行的時(shí)候(可能是業(yè)務(wù)上的需要耸三,也可能是軟件上的調(diào)優(yōu)),僅僅需要把maxConcurrentOperationCount設(shè)為“1”浇揩。
- (IBAction)grabURLInTheBackground:(id)sender
{
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is an NSOperationQueue
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
創(chuàng)建NSOperationQueue仪壮,這個(gè)Cocoa架構(gòu)的執(zhí)行任務(wù)(NSOperation)的任務(wù)隊(duì)列。我們通過(guò)ASIHTTPRequest.h的源碼可以看到胳徽,此類本身就是一個(gè)NSOperation的子類积锅。也就是說(shuō)它可以直接被放到"任務(wù)隊(duì)列"中,并被執(zhí)行养盗。上面的代碼隊(duì)了隊(duì)列的創(chuàng)建與添加操作外缚陷,其它代碼與上一例一樣。
請(qǐng)求隊(duì)列上下文
a爪瓜,可以設(shè)置一個(gè)上下文(userInfo)到request對(duì)象中蹬跃,當(dāng)請(qǐng)求響應(yīng)完后可以通過(guò)訪問request對(duì)象的userInfo獲取里面的信息
b,為每一個(gè)請(qǐng)求實(shí)例設(shè)置不同的setDidFinishSelector / setDidFailSelector的回調(diào)方法
c铆铆,子類化ASIHTTPRequest蝶缀,重寫requestFinished: 與 failWithProblem:方法
ASINetworkQueues, 它的delegate提供更為豐富的功能
提供的更多的回調(diào)方法如下:
a,requestDidStartSelector薄货,請(qǐng)求發(fā)起時(shí)會(huì)調(diào)此方法翁都,你可以在此方法中跟據(jù)業(yè)務(wù)選擇性的設(shè)置request對(duì)象的deleaget。
b谅猾,requestDidReceiveResponseHeadersSelector柄慰,當(dāng)接受完響應(yīng)的Header后設(shè)計(jì)此方法鳍悠,這個(gè)對(duì)下載大數(shù)據(jù)的時(shí)候相當(dāng)有用,你可以在方法里做更多業(yè)務(wù)上的處理坐搔。
c藏研,requestDidFinishSelector,請(qǐng)求并響應(yīng)成功完成時(shí)調(diào)用此方法
d概行,requestDidFailSelector蠢挡,請(qǐng)求失敗
e,queueDidFinishSelector凳忙,整個(gè)隊(duì)列里的所有請(qǐng)求都結(jié)束時(shí)調(diào)用此方法业踏。
它是NSOperationQueues的擴(kuò)展,小而強(qiáng)大涧卵。但也與它的父類略有區(qū)別勤家。如,僅添加到隊(duì)列中其實(shí)并不能執(zhí)行請(qǐng)求柳恐,只有調(diào)用[ queue g o]才會(huì)執(zhí)行伐脖;一個(gè)正在運(yùn)行中的隊(duì)列,并不需要重復(fù)調(diào)用[ queue go ]乐设。
默認(rèn)情況下晓殊,隊(duì)列中的一個(gè)請(qǐng)求如果失敗,它會(huì)取消所有未完成的請(qǐng)求伤提∥装常可以設(shè)置[ queue setShouldCancelAllRequestsOnFailure:NO ]來(lái)修 正。
取消異步請(qǐng)求
其次肿男,不管是隊(duì)列請(qǐng)求介汹,還是簡(jiǎn)單的異步請(qǐng)求,全部調(diào)用[ request cancel ]來(lái)取消請(qǐng)求舶沛。
取消的請(qǐng)求默認(rèn)都會(huì)按請(qǐng)求失敗處理嘹承,并調(diào)用請(qǐng)求失敗delegate。
如果不想調(diào)用delegate方法如庭,則設(shè)置:[ request clearDelegatesAndCancel];
隊(duì)列請(qǐng)求中需要注意的是叹卷,如果你取消了一個(gè)請(qǐng)求,隊(duì)列會(huì)自動(dòng)取消其它所有請(qǐng)求坪它。
如果只想取消一個(gè)請(qǐng)求骤竹,可以設(shè)置隊(duì)列:[ queue setShouldCancelAllRequestsOnFailure:NO ];
如果想明確取消所有請(qǐng)求:[ queue cancelAllOperations ];
//安全的內(nèi)存回收建議//
request并沒有retain你的delegate,所以在沒有請(qǐng)求完的時(shí)候釋放了此delegate往毡,需要在dealloc方法里先取消所有請(qǐng)求蒙揣,再釋放請(qǐng)求實(shí)例,如:
- (void)dealloc
{
[request clearDelegatesAndCancel];
[request release];
...
[super dealloc];
}
向服務(wù)器端上傳數(shù)據(jù)
ASIFormDataRequest 开瞭,模擬 Form表單提交懒震,其提交格式與 Header會(huì)自動(dòng)識(shí)別罩息。
沒有文件:application/x-www-form-urlencoded
有文件:multipart/form-data
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
[request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg"forKey:@"photos"];
如果要發(fā)送自定義數(shù)據(jù):
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];
// Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
[request setRequestMethod:@"PUT"];
下載文件
通過(guò)設(shè)置request的setDownloadDestinationPath,可以設(shè)置下載文件用的下載目標(biāo)目錄个扰。
首先瓷炮,下載過(guò)程文件會(huì)保存在temporaryFileDownloadPath目錄下。如果下載完成會(huì)做以下事情:
1递宅,如果數(shù)據(jù)是壓縮的崭别,進(jìn)行解壓,并把文件放在downloadDestinationPath目錄中恐锣,臨時(shí)文件被刪除
2,如果下載失敗舞痰,臨時(shí)文件被直接移到downloadDestinationPath目錄土榴,并替換同名文件。
如果你想獲取下載中的所有數(shù)據(jù)响牛,可以實(shí)現(xiàn)delegate中的request:didReceiveData:方法玷禽。但如果你實(shí)現(xiàn)了這個(gè)方法,request在下載完后呀打,request并不把文件放在downloadDestinationPath中矢赁,需要手工處理。
獲取響應(yīng)信息
信息:status , header, responseEncoding
[request responseStatusCode];
[[request responseHeaders] objectForKey:@"X-Powered-By"];
[request responseEncoding];
獲取請(qǐng)求進(jìn)度
有兩個(gè)回調(diào)方法可以獲取請(qǐng)求進(jìn)度贬丛,
1撩银,downloadProgressDelegate,可以獲取下載進(jìn)度
2豺憔,uploadProgressDelegate额获,可以獲取上傳進(jìn)度
cookie的支持
如果Cookie存在的話,會(huì)把這些信息放在NSHTTPCookieStorage容器中共享恭应,并供下次使用抄邀。
你可以用[ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有Cookies。
當(dāng)然昼榛,你也可以取消默認(rèn)的Cookie策略境肾,而使自定義的Cookie:
//Create a cookie
NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
[properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue];
[properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName];
[properties setValue:@".allseeing-i.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];
//This url will return the value of the 'ASIHTTPRequestTestCookie' cookie
url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"];
request = [ASIHTTPRequest requestWithURL:url];
[request setUseCookiePersistence:NO];
[request setRequestCookies:[NSMutableArray arrayWithObject:cookie]];
[request startSynchronous];
//Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie'
NSLog(@"%@",[request responseString]);
大文件斷點(diǎn)續(xù)傳
0.94以后支持大文件的斷點(diǎn)下載,只需要設(shè)置:
[ request setAllowResumeForFileDownloads:YES ];
[ request setDownloadDestinationPath:downloadPath ];
就可以了胆屿。
ASIHTTPRequest會(huì)自動(dòng)保存訪問過(guò)的URL信息奥喻,并備之后用。在以下幾個(gè)場(chǎng)景非常有用:
1非迹,當(dāng)沒有網(wǎng)絡(luò)連接的時(shí)候衫嵌。
2,已下載的數(shù)據(jù)再次請(qǐng)求時(shí)彻秆,僅當(dāng)它與本地版本不樣時(shí)才進(jìn)行下載楔绞。
ASIDownloadCache 設(shè)置下載緩存
它對(duì)Get請(qǐng)求的響應(yīng)數(shù)據(jù)進(jìn)行緩存(被緩存的數(shù)據(jù)必需是成功的200請(qǐng)求):
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];
當(dāng)設(shè)置緩存策略后结闸,所有的請(qǐng)求都被自動(dòng)的緩存起來(lái)。
另外酒朵,如果僅僅希望某次請(qǐng)求使用緩存操作桦锄,也可以這樣使用:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
多種的緩存并存
僅僅需要?jiǎng)?chuàng)建不同的ASIDownloadCache,并設(shè)置緩存所使用的路徑蔫耽,并設(shè)置到需要使用的request實(shí)例中:
ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];
[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];
[self setMyCache:cache];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[self myCache]];
緩存策略
緩存策略是我們控制緩存行為的主要方式结耀,如:什么時(shí)候進(jìn)行緩存,緩存數(shù)據(jù)的利用方式匙铡。
以下是策略可選列表(可組合使用):
○ASIUseDefaultCachePolicy 這是一個(gè)默認(rèn)的緩存策略“ASIAskServerIfModifiedWhenStaleCachePolicy”图甜,這個(gè)很明白,見名知意(它不能與其它策略組合使用)
○ASIDoNotReadFromCacheCachePolicy 所讀數(shù)據(jù)不使用緩存
○ASIDoNotWriteToCacheCachePolicy 不對(duì)緩存數(shù)據(jù)進(jìn)行寫操作
○ASIAskServerIfModifiedWhenStaleCachePolicy 默認(rèn)緩存行為鳖眼,request會(huì)先判斷是否存在緩存數(shù)據(jù)黑毅。a, 如果沒有再進(jìn)行網(wǎng)絡(luò)請(qǐng)求。 b钦讳,如果存在緩存數(shù)據(jù)矿瘦,并且數(shù)據(jù)沒有過(guò)期,則使用緩存愿卒。c缚去,如果存在緩存數(shù)據(jù),但已經(jīng)過(guò)期琼开,request會(huì)先進(jìn)行網(wǎng)絡(luò)請(qǐng)求易结,判斷服務(wù)器版本與本地版本是否一樣,如果一樣柜候,則使用緩存衬衬。如果服務(wù)器有新版本,會(huì)進(jìn)行網(wǎng)絡(luò)請(qǐng)求改橘,并更新本地緩存
○ASIAskServerIfModifiedCachePolicy 與默認(rèn)緩存大致一樣滋尉,區(qū)別僅是每次請(qǐng)求都會(huì) 去服務(wù)器判斷是否有更新
○ASIOnlyLoadIfNotCachedCachePolicy 如果有緩存在本地,不管其過(guò)期與否飞主,總會(huì)拿來(lái)使用
○ASIDontLoadCachePolicy 僅當(dāng)有緩存的時(shí)候才會(huì)被正確執(zhí)行狮惜,如果沒有緩存,request將被取消(沒有錯(cuò)誤信息)
○ASIFallbackToCacheIfLoadFailsCachePolicy 這個(gè)選項(xiàng)經(jīng)常被用來(lái)與其它選項(xiàng)組合使用碌识。請(qǐng)求失敗時(shí)碾篡,如果有緩存當(dāng)網(wǎng)絡(luò)則返回本地緩存信息(這個(gè)在處理異常時(shí)非常有用)
如果設(shè)置了“defaultCachePolicy”則所有的請(qǐng)求都會(huì)使用此緩存。
緩存存儲(chǔ)方式
你可以設(shè)置緩存的數(shù)據(jù)需要保存多長(zhǎng)時(shí)間筏餐,ASIHTTPRequest提供了兩種策略:
a开泽,ASICacheForSessionDurationCacheStoragePolicy,默認(rèn)策略魁瞪,基于session的緩存數(shù)據(jù)存儲(chǔ)穆律。當(dāng)下次運(yùn)行或[ASIHTTPRequest clearSession]時(shí)惠呼,緩存將失效。
b峦耘,ASICachePermanentlyCacheStoragePolicy剔蹋,把緩存數(shù)據(jù)永久保存在本地,
如:
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];
另外辅髓,也可以使用clearCachedResponsesForStoragePolicy來(lái)清空指定策略下的緩存數(shù)據(jù)泣崩。
緩存其它特性
設(shè)置是否按服務(wù)器在Header里指定的是否可被緩存或過(guò)期策略進(jìn)行緩存:
[[ ASIDownloadCache sharedCache ] setShouldRespectCacheControlHeaders:NO ];
設(shè)置request緩存的有效時(shí)間:
[ request setSecondsToCache:60*60*24*30 ]; // 緩存30天
可以判斷數(shù)據(jù)是否從緩存讀取:
[ request didUseCachedResponse ];
設(shè)置緩存所使用的路徑:
[ request setDownloadDestinationPath:[[ ASIDownloadCache sharedCache ] pathToStoreCachedResponseDataForRequest:request ]];
實(shí)現(xiàn)自定義的緩存
只要簡(jiǎn)單的實(shí)現(xiàn)ASICacheDelegate接口就可以被用來(lái)使用洛口。
使用代理請(qǐng)求
默認(rèn)的情況下矫付,ASIHTTPRequest會(huì)使用被設(shè)置的默認(rèn)代理。但你也可以手動(dòng)修改http代理:
// Configure a proxy server manually
NSURL *url = [ NSURL URLWithString:@"http://allseeing-i.com/ignore" ];
ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];
[ request setProxyHost:@"192.168.0.1" ];
[ request setProxyPort:3128 ];
// Alternatively, you can use a manually-specified Proxy Auto Config file (PAC)
// (It's probably best if you use a local file)
[request setPACurl:[NSURL URLWithString:@"file:///Users/ben/Desktop/test.pac"]];
ASIHTTPRequest, 請(qǐng)求的其它特性
iOS4中第焰,當(dāng)應(yīng)用后臺(tái)運(yùn)行時(shí)仍然請(qǐng)求數(shù)據(jù):
[ request setShouldContinueWhenAppEntersBackground:YES ];
是否有網(wǎng)絡(luò)請(qǐng)求:
[ ASIHTTPRequest isNetworkInUse ]
是否顯示網(wǎng)絡(luò)請(qǐng)求信息在status bar上:
[ ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO ];
設(shè)置請(qǐng)求超時(shí)時(shí)买优,設(shè)置重試的次數(shù):
[ request setNumberOfTimesToRetryOnTimeout:2 ];
KeepAlive的支持:
// Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
[ request setPersistentConnectionTimeoutSeconds:120 ];
// Disable persistent connections entirely
[ request setShouldAttemptPersistentConnection:NO ];
ASIHTTPRequest 一款強(qiáng)大的HTTP包裝開源項(xiàng)目
ASIHTTPRequest,是一個(gè)直接在CFNetwork上做的開源項(xiàng)目樟遣,提供了一個(gè)比官方更方便更強(qiáng)大的HTTP網(wǎng)絡(luò)傳輸?shù)姆庋b。
特色功能如下:
1身笤,下載的數(shù)據(jù)直接保存到內(nèi)存或文件系統(tǒng)里
2豹悬,提供直接提交(HTTP POST)文件的API
3,可以直接訪問與修改HTTP請(qǐng)求與響應(yīng)HEADER
4液荸,輕松獲取上傳與下載的進(jìn)度信息
5瞻佛,異步請(qǐng)求與隊(duì)列,自動(dòng)管理上傳與下載隊(duì)列管理機(jī)
6娇钱,認(rèn)證與授權(quán)的支持
7伤柄,Cookie
8,請(qǐng)求與響應(yīng)的GZIP
9文搂,代理請(qǐng)求
下面來(lái)兩個(gè)小例子:
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request start];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
當(dāng)你需要添加更多的請(qǐng)求信息時(shí)适刀,如,添加個(gè)請(qǐng)求Header:
[request addRequestHeader:@"name" value:@"Jory lee"];
添加Post請(qǐng)求時(shí)的健值:
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
設(shè)置HTTP的授權(quán)帳號(hào):
[request setUsername:@"username"];
[request setPassword:@"password"];
一個(gè)異步請(qǐng)求:
- (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
{
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
在我們數(shù)據(jù)獲取的過(guò)程中煤蹭,如果數(shù)據(jù)源復(fù)雜笔喉,一個(gè)請(qǐng)求隊(duì)列是必不可少的:
- (IBAction)grabURLInTheBackground:(id)sender
{
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is an NSOperationQueue
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
ASIHTTPRequest -Main classes介紹:
1.ASIHTTPRequest:處理與服務(wù)器的基本交互,包括下載上傳硝皂,認(rèn)證常挚,cookies以及進(jìn)度查看。
2.ASIFormDataRequest:是ASIHTTPRequest子類稽物,主要處理post事件奄毡,它能使post更加簡(jiǎn)單。
3.ASINetworkQueue:是NSOperationQueue子類贝或,當(dāng)處理多個(gè)請(qǐng)求時(shí)可以使用吼过,如果每次都是單個(gè)請(qǐng)求就不必使用锐秦。
4.ASIDownloadCache:該類允許ASIHTTPRequest從服務(wù)器傳遞cookie。
ASIHTTPRequest -Support classes介紹:
1.ASIInputStream:當(dāng)使用ASIHTTPRequest上傳數(shù)據(jù)時(shí)使用那先,如果工程中用了ASIHTTPRequest农猬,就一定要include這個(gè)類。
2.ASIAuthenticationDialog:該類允許ASIHTTPRequest連接到服務(wù)器時(shí)呈現(xiàn)登錄框售淡。在所有iPhone OS工程中都要使用毒姨,Mac OS工程中可以不用冈欢。
3.Reachability:相信很多人對(duì)這個(gè)類已經(jīng)很熟悉了,當(dāng)在你程序中偵測(cè)網(wǎng)絡(luò)狀態(tài)時(shí)它將非常有用。
ASIHTTPRequest -Protocols and configuration介紹:
1.ASIHTTPRequestDelegate:該協(xié)議指定了ASIHTTPRequest的delegate可能需要實(shí)現(xiàn)的方法凄杯,所有方法都是optional。
2.ASIProgressDelegate:該協(xié)議列出了uploadProgressDelegate和downloadProgressDelegate可能需要實(shí)現(xiàn)的方法织狐,所有方法為optional骗绕。
3.ASICacheDelegate:該協(xié)議指定了download cache必須實(shí)現(xiàn)的方法。如果你要寫你自己的download cache贮泞,確保實(shí)現(xiàn)required方法楞慈。
4.ASIHTTPRequestConfig.h:該文件定義了編譯時(shí)所有的全局配置選項(xiàng)。使用該文件中的方法可以在控制臺(tái)中輸出request正在進(jìn)行的任務(wù).
使用ASIHTTPRequest獲取文本HTTP響應(yīng)
如果要在ios中實(shí)現(xiàn)類似最簡(jiǎn)單的HttpClient應(yīng)用的功能啃擦,可以直接用Cocoa的CFNetwork framework囊蓝,但是,因?yàn)樗菍語(yǔ)言編寫的BSD網(wǎng)絡(luò)庫(kù)做的封裝令蛉,因此使用起來(lái)很繁瑣聚霜。
ASIHTTPRequest是第三方HTTP編程的ObjC庫(kù)≈槭澹基于CFNetwork framework蝎宇。網(wǎng)址在這里:
http://allseeing-i.com/ASIHTTPRequest
要使用該庫(kù),首先是下載部署祷安。下載zip包解壓縮即可姥芥。部署可見官方文檔:
http://allseeing-i.com/ASIHTTPRequest/Setup-instructions
這里也說(shuō)一下,首先該庫(kù)還依賴其他框架和庫(kù):
一般來(lái)說(shuō)汇鞭,是增加畫紅線的幾個(gè)框架撇眯。
然后,需要把解壓縮包里的Classes目錄下全部文件加到項(xiàng)目的Classes下虱咧。這里要注意:
這幾個(gè)目錄除外熊榛。除非你確實(shí)用到它。
另外腕巡,還需要加入External/Reachability目錄下的文件玄坦。
代碼寫起來(lái)很簡(jiǎn)單:
-(void) doSimpleGetText{
NSURL *url = [NSURL URLWithString:@"