小嘗ASIHTTPReques

一逗嫡、什么是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:@"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煎楣,更是在濱河造成了極大的恐慌豺总,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件择懂,死亡現(xiàn)場(chǎng)離奇詭異喻喳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)困曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門表伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慷丽,你說(shuō)我怎么就攤上這事蹦哼。” “怎么了要糊?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵纲熏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锄俄,道長(zhǎng)局劲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任奶赠,我火速辦了婚禮鱼填,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘车柠。我一直安慰自己剔氏,他們只是感情好塑猖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布竹祷。 她就那樣靜靜地躺著,像睡著了一般羊苟。 火紅的嫁衣襯著肌膚如雪塑陵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天蜡励,我揣著相機(jī)與錄音令花,去河邊找鬼。 笑死凉倚,一個(gè)胖子當(dāng)著我的面吹牛兼都,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稽寒,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扮碧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起慎王,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚓土,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赖淤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜀漆,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年咱旱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了确丢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莽龟,死狀恐怖蠕嫁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毯盈,我是刑警寧澤剃毒,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站搂赋,受9級(jí)特大地震影響赘阀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脑奠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一基公、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宋欺,春花似錦轰豆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祷杈,卻和暖如春斑司,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背但汞。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工宿刮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人私蕾。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓僵缺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親踩叭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磕潮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http揉抵、Socket亡容、X...
    Carden閱讀 4,338評(píng)論 0 12
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)冤今,斷路器闺兢,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,383評(píng)論 0 6
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā),例如說(shuō)新浪微博戏罢、微信等屋谭,這些應(yīng)用本身可...
    lichengjin閱讀 3,661評(píng)論 2 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,354評(píng)論 0 35