ASIHttpRequest使用詳解
轉載:http://www.cnblogs.com/pengyingh/articles/2343062.html
- l 通過簡單的介面,即可完成向服務端提交資料和從服務端獲取資料的工作
- l 下載的資料,可儲存到記憶體中或直接儲存到磁碟中
- l 能上傳本地檔案到服務端
- l 可以方便的訪問和操作請求和返回的Http頭資訊
- l 可以獲取到上傳或下載的進度資訊,為應用程式提供更好的體驗
-
目錄
-
發起一個同步請求
-
建立一個非同步請求
-
佇列請求
-
請求佇列上下文
-
ASINetworkQueues, 它的delegate提供更為豐富的功能
-
取消非同步請求
-
安全的記憶體回收建議
-
向伺服器端上傳資料
-
下載檔案
-
獲取響應資訊
-
獲取請求進度
-
cookie的支援
-
大檔案斷點續傳
-
ASIDownloadCache 設定下載快取
-
多種的快取並存
-
快取策略
-
快取儲存方式
-
快取其它特性
-
實現自定義的快取
-
使用代理請求
-
ASIHTTPRequest, 請求的其它特性
ASIHTTPRequest是一款極其強勁的HTTP訪問開源專案。讓簡單的API完成複雜的功能,
如:非同步請求,佇列請求,GZIP壓縮,快取,斷點續傳,進度跟蹤,上傳檔案,HTTP認證在新的版本中,還加入了Objective-C閉包Block的支援,讓我們的程式碼更加輕簡靈活。
下面就舉例說明它的API用法。
一,發起一個同步請求
同步意為著執行緒阻塞,在主執行緒中使用此方法會使應用Hang住而不響應任何使用者事件。所以,在應用程式設計時,大多被用在專門的子執行緒增加使用者體驗,或用非同步請求代替(下面會講到)。
- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request startSynchronous];NSError *error = [request error];if (!error) {
NSString *response = [request responseString];}
}
a,用requestWithURL快捷方法獲取ASIHTTPRequest的一個例項
b, startSynchronous方法啟動同步訪問,
c,由於是同步請求,沒有基於事件的回撥方法,所以從request的error屬性獲取錯誤資訊。
d, responseString,為請求的返回NSString資訊。
二,發起一個非同步請求
非同步請求的好處是不阻塞當前執行緒,但相對於同步請求略為複雜,至少要新增兩個回撥方法來獲取非同步事件。下面非同步請求程式碼完成上面同樣的一件事情:
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request{
// Use when fetching text data
NSString *responseString = [request responseString];
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request{
NSError *error = [request error];
}
a,與上面不同的地方是指定了一個“delegate”,並用startAsynchronous來啟動網路請求。
b,在這裡實現了兩個delegate的方法,當資料請求成功時會呼叫requestFinished,請求失敗時(如網路問題或伺服器內部錯誤)會呼叫requestFailed。
三,佇列請求
提供了一個對非同步請求更加精準豐富的控制。如,可以設定在佇列中,同步請求的連線數。往佇列裡新增的請求例項數大於maxConcurrentOperationCount時,請求例項將被置為等待,直到前面至少有一個請求完成並出列才被放到佇列裡執行。也適用於當我們有多個請求需求按順序執行的時候(可能是業務上的需要,也可能是軟件上的調優),僅僅需要把maxConcurrentOperationCount設為“1”。
- (IBAction)grabURLInTheBackground:(id)sender{
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init]
autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is anNSOperationQueue
}
-(void)requestDone:(ASIHTTPRequest *)request{
NSString *response = [request responseString];
}
-(void)requestWentWrong:(ASIHTTPRequest *)request{
NSError *error = [request error];
}
建立NSOperationQueue,這個Cocoa架構的執行任務(NSOperation)的任務佇列。我們通過ASIHTTPRequest.h的原始碼可以看到,此類本身就是一個NSOperation的子類。也就是說它可以直接被放到”任務佇列”中,並被執行。上面的程式碼隊了佇列的建立與新增操作外,其它程式碼與上一例一樣。
a,可以設定一個上下文(userInfo)到request對象中,當請求響應完後可以通過訪問request對象的userInfo獲取裡面的資訊
b,為每一個請求例項設定不同的setDidFinishSelector / setDidFailSelector
的回撥方法
c,子類化ASIHTTPRequest,重寫requestFinished:與failWithProblem:方法
五,ASINetworkQueues delegate提供的更多的回撥方法如下
:a,requestDidStartSelector,請求發起時會調此方法,你可以在此方法中跟據業務選擇性的設定request對象的delegate。
b,requestDidReceiveResponseHeadersSelector,當接受完響應的Header後設計此方法,這個對下載大資料的時候相當有用,你可以在方法裡做更多業務上的處理。
c,requestDidFinishSelector,請求並響應成功完成時呼叫此方法
d,requestDidFailSelector,請求失敗
e,queueDidFinishSelector,整個佇列裡的所有請求都結束時呼叫此方法。
它是NSOperationQueues的擴充套件,小而強大。但也與它的父類略有區別。如,僅新增到佇列中其實並不能執行請求,只有呼叫[ queue g o]才會執行;一個正在執行中的佇列,並不需要重復呼叫[ queue go ]。
默認情況下,佇列中的一個請求如果失敗,它會取消所有未完成的請求。可以設定[ queuesetShouldCancelAllRequestsOnFailure:NO ]來修 正。
六,取消非同步請求
首先,同步請求是不能取消的。其次,不管是佇列請求,還是簡單的非同步請求,全部呼叫[ request cancel ]來取消請求。
取消的請求默認都會按請求失敗處理,並呼叫請求失敗delegate。
如果不想呼叫delegate方法,則設定:[
request clearDelegatesAndCancel];佇列請求中需要注意的是,如果你取消了一個請求,佇列會自動取消其它所有請求。
如果只想取消一個請求,可以設定佇列:[
queuesetShouldCancelAllRequestsOnFailure:NO ];
如果想明確取消所有請求:[ queue cancelAllOperations ];
request並沒有retain你的delegate,所以在沒有請求完的時候釋放了此delegate,需要在dealloc方法裡先取消所有請求,再釋放請求例項,如:
- (void)dealloc
{
[request clearDelegatesAndCancel];[request release];
...
[super dealloc];
}
八,向服務端上傳資料
ASIFormDataRequest,模擬Form表單提交,其提交格式與Header會自動識別。
沒有檔案:application/x-www-form-urlencoded有檔案:multipart/form-data
<span style="font-size:18px;">ASIFormDataRequest *request = [ASIFormDataRequestrequestWithURL: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"];如果要傳送自定義資料:
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request appendPostData:[@"This is my data"dataUsingEncoding:NSUTF8StringEncoding]];
// Default becomes POST when you use appendPostData: /appendPostDataFromFile: / setPostBody:
[request setRequestMethod:@"PUT"];</span>
九,下載檔案
通過設定request的setDownloadDestinationPath,可以設定下載檔案用的下
載目標目錄。首先,下載過程檔案會保存在temporaryFileDownloadPath目錄下。如果下載完成會做以下事情:1,如果資料是壓縮的,進行解壓,並把檔案放在downloadDestinationPath目錄中,臨時檔案被刪除2,如果下載失敗,臨時檔案被直接移到downloadDestinationPath目錄,並替換同名檔案。
如果你想獲取下載中的所有資料,可以實現delegate中的request:didReceiveData:方法。但如果你實現了這個方法,request在下載完後,request並不把檔案放在downloadDestinationPath中,需要手工處理。
資訊:status , header, responseEncoding
[request responseStatusCode];
[[request responseHeaders] objectForKey:@"X-Powered-By"];
[request responseEncoding];
有兩個回撥方法可以獲取請求進度,
1,downloadProgressDelegate,可以獲取下載進度
2,uploadProgressDelegate,可以獲取上傳進度
10,cookie
cookie如果Cookie存在的話,會把這些資訊放在NSHTTPCookieStorage容器中共享,並供下次使用。
你可以用[ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有Cookies。當然,你也可以取消默認的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:[NSDatedateWithTimeIntervalSinceNow: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:[NSMutableArrayarrayWithObject:cookie]];
[request startSynchronous];
//Should be: I have 'Test Value' as the value of'ASIHTTPRequestTestCookie'
NSLog(@"%@",[request responseString]);
十一,大檔案斷點續傳
0.94以後支援大檔案的斷點下載,只需要設定:
[ request setAllowResumeForFileDownloads:YES ];
[ request setDownloadDestinationPath:downloadPath ];
就可以了。ASIHTTPRequest會自動保存訪問過的URL資訊,並備之後用。在以下幾個場景非常有用:
1,當沒有網路連線的時候。
2,已下載的資料再次請求時,僅當它與本地版本不樣時才進行下載。
十二,ASIDownloadCache 設定下載快取
ASIDownloadCache它對Get請求的響應資料進行快取(被快取的資料必需是成功的200請求):
[ASIHTTPRequest setDefaultCache:[ASIDownloadCachesharedCache]];當設定快取策略後,所有的請求都被自動的快取起來。另外,如果僅僅希望某次請求使用快取操作,也可以這樣使用:ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request setDownloadCache:[ASIDownloadCachesharedCache]];
僅僅需要建立不同的ASIDownloadCache,並設定快取所使用的路徑,並設定到需要使用的request例項中:
ASIDownloadCache *cache = [[[ASIDownloadCache alloc]init] autorelease];
[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];
[self setMyCache:cache];
ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];
[request setDownloadCache:[self myCache]];
十三,快取策略
快取策略是我們控制快取行為的主要方式,如:什麼時候進行快取,快取資料的利用方式。
以下是策略可選列表(可組合使用):
ASIUseDefaultCachePolicy
ASIDoNotReadFromCacheCachePolicy
這是一個默認的快取策略“ASIAskServerIfModifiedWhenStaleCachePolicy”,這個很明白,見名知意(它不能與其它策略組合使用)
所讀資料不使用快取ASIDoNotWriteToCacheCachePolicy不對快取資料進行寫操作
默認快取行為,request會先判斷是否存在快取資料。
a,如果沒有再進行網路請求。
b,如果存在快取資料,並且資料沒有過,ASIAskServerIfModifiedWhenStaleC期,則使用快取。
c,如果存在快取資料,achePolicy但已經過期,request會先進行網路請求,
判斷伺服器版本與本地版本是否一樣,如果 一樣,則使用快取。如果伺服器有新版本,
能與其它策略組合使用)
ASIDoNotReadFromCacheCachePolicy
所讀資料不使用快取ASIDoNotWriteToCacheCachePolicy不對快取資料進行寫操作
ASIAskServerIfModifiedWhenStaleCachePolicy
ASIAskServerIfModifiedCachePolicyASIOnlyLoadIfNotCachedCachePolicy
ASIDontLoadCachePolicy
ASIFallbackToCacheIfLoadFailsCachePolicy
默認快取行為,request會先判斷是否存在快取資料。
a,如果沒有再進行網路請求。
b,如果存在快取資料,並且資料沒有過期,則使用快取。
c,如果存在快取資料,但已經過期,request會先進行網路請求,判斷伺服器版本與本地版本是否一樣,如果一樣,則使用快取。
如果伺服器有新版本,會進行網路請求,並更新本地快取與默認快取大致一樣,區別僅是每次請求都會去伺服器判斷是否有更新
如果有快取在本地,不管其過期與否,總會
拿來使用
僅當有快取的時候才會被正確執行,如果沒有快取,request將被取消(沒有錯誤資訊)這個選項經常被用來與其它選項組合使用。請求失敗時,如果有快取當網路則返回本地快取資訊(這個在處理異常時非常有用)
如果設定了“defaultCachePolicy”則所有的請求都會使用此快取。
你可以設定快取的資料需要保存多長時間,ASIHTTPRequest提供了兩種策略:
a,ASICacheForSessionDurationCacheStoragePolicy,默認策略,基於session的快取資料儲存。
當下次執行或[ASIHTTPRequest clearSession]時,快取將失效。
b,ASICachePermanentlyCacheStoragePolicy,把快取資料永久保存在本地,
如:
ASIHTTPRequest *request = [ ASIHTTPRequestrequestWithURL:url ];
[ request
setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];
另外,也可以使用clearCachedResponsesForStoragePolicy來清空指定策略下的快取資料。
設定是否按伺服器在Header裡指定的是否可被快取或過期策略進行快取:
[[ ASIDownloadCache sharedCache ]setShouldRespectCacheControlHeaders:NO ];設定request快取的有效時間:
[ request setSecondsToCache:60*60*24*30 ]; //快取30天可以判斷資料是否從快取讀取:
[ request didUseCachedResponse ];
設定快取所使用的路徑:
[ request setDownloadDestinationPath:[[ ASIDownloadCachesharedCache ]pathToStoreCachedResponseDataForRequest:request ]];只要簡單的實現ASICacheDelegate接口就可以被用來使用。
十四,使用代理請求
默認的情況下,ASIHTTPRequest會使用被設定的默認代理。但你也可以手動修改http代理:
// Configure a proxy server manually
NSURL *url = [ NSURL URLWithString:@"http://allseeing-i.com/ignore" ];
ASIHTTPRequest *request = [ ASIHTTPRequestrequestWithURL:url ];
[ request setProxyHost:@"192.168.0.1" ];[ request setProxyPort:3128 ];
// Alternatively, you can use a manually-specified ProxyAuto Config file (PAC)
// (It's probably best if you use a local file)[request setPACurl:[NSURL URLWithString:@"file:///Users/
ben/Desktop/test.pac"]];
ASIHTTPRequest,iOS4中,當應用後臺執行時仍然請求資料:
[ requestsetShouldContinueWhenAppEntersBackground:YES ];是否有網路請求:
[ ASIHTTPRequest isNetworkInUse ]是否顯示網路請求資訊在status
bar上:
[ ASIHTTPRequestsetShouldUpdateNetworkActivityIndicator:NO ];設定請求超時時,設定重試的次數:
[ request setNumberOfTimesToRetryOnTimeout:2 ];
KeepAlive的支援:
// Set the amount of time to hang on to a persistentconnection before it should expire to 2 minutes
[ request setPersistentConnectionTimeoutSeconds:120 ];
// Disable persistent connections entirely
[ request setShouldAttemptPersistentConnection:NO ];
... other posts bypimacun
參考來源:
相關文章
- (iphone/ipad開發技術)ASIHTTPRequest 詳解iPhoneiPadHTTP
- ASIHTTPRequest庫HTTP
- ASIHTTPRequest類庫簡介和使用說明HTTP
- 'libxml/HTMLparser.h' file not found in ASIHTTPRequest 解決方法XMLHTMLHTTP
- ios編譯ASIHTTPRequest時出現 'libxml/HTMLparser.h' file not found in ASIHTTPRequestiOS編譯HTTPXMLHTML
- 多執行緒-NSOperation中使用ASIHttpRequest注意事項執行緒HTTP
- Jpa使用詳解
- mitmproxy使用詳解MIT
- Thymeleaf使用詳解
- mydumper使用詳解
- babel使用詳解Babel
- git使用詳解Git
- Mat使用詳解
- Proxy使用詳解
- nvm 使用詳解
- CSSModules使用詳解CSSSSM
- ctags使用詳解
- AutoLayout 使用詳解
- umask使用詳解
- OkHttp使用詳解HTTP
- Okhttp 使用詳解HTTP
- Inception使用詳解
- UITableView使用詳解UIView
- ViewFlipper使用詳解View
- NULL 使用詳解Null
- at命令使用詳解
- LOMBOK使用詳解Lombok
- ASIHttpRequest:建立佇列、下載請求、斷點續傳、解壓縮HTTP佇列斷點
- 升級到iOS5後ASIHttpRequest庫問題及解決方法iOSHTTP
- Supervisor使用詳解
- React Hooks 使用詳解ReactHook
- CMAKE的使用詳解
- Go Modules 詳解使用Go
- MFC——SkinMagic使用詳解
- Logstash使用詳解
- sed指令使用詳解
- Mybatis的使用詳解MyBatis
- Postman 使用教程詳解Postman