ASIHTTPRequest 系統需求:git
ASIHTTPRequest Version | Minimum iOS Target | Target Notes
---------------------------|--------------------------|---------------------
1.8.1 -> 1.8.2 | iOS 3.0+ |
0.2 -> 1.8.0 | |程序員
ASIHTTPRequest 使用 MRCgithub
Objective-Cweb
// 添加系統庫文件 CFNetwork.framework SystemConfiguration.framework MobileCoreServices.framework CoreGraphics.framework libz.1.1.3.tbd libxml2.2.tbd // 添加第三方庫文件 ASIHTTPRequest-1.8.2 // 在 TARGETS -> Builed Settings -> Search Paths -> Header Search Paths 中添加文件路徑 /usr/include/libxml2 // 在 TARGETS -> Build Phases -> Compile Sources -> ...in .../ASIHTTPRequest 後添加 -fno-objc-arc // 包含頭文件 #import "ASIHTTPRequest.h" #import "ASIFormDataRequest.h"
Objective-Capi
// 設置請求頭 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]]; [request addRequestHeader:@"Referer" value:@"http://www.dreamingwish.com/"]; // 設置應用後臺運行時是否仍然請求數據 request.shouldContinueWhenAppEntersBackground = YES; // 設置請求超時時重試的次數 request.numberOfTimesToRetryOnTimeout = 3; // 設置 KeepAlive 支持 // Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes request.persistentConnectionTimeoutSeconds = 120; // Disable persistent connections entirely request.shouldAttemptPersistentConnection = NO; // 設置是否顯示網絡請求信息在 status bar 上 [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO]; // 網絡狀態檢查 BOOL isNetworkInUse = [ASIHTTPRequest isNetworkInUse];
這是 ASIHTTPRequest 最簡單的一種使用模式,發送 startSynchronous 消息後即開始在同一線程中執行 HTTP 請求,線程將一直等待直到請求結束(請求成功或者失敗)。經過檢查 error 屬性能夠判斷請求是否成功或者有錯誤發生。緩存
要獲取返回的文本信息,調用 responseString 方法。若是下載的是二進制文件,例如圖片、MP3,則調用 responseData 方法,能夠獲得一個 NSData 對象。服務器
通常狀況下,應該優先使用異步請求代替同步請求,當在主線程中使用 ASIHTTPRequest 同步請求會阻塞主線程的執行,這致使用戶界面不響應用戶操做,任何動畫都會中止渲染,直到請求完成。網絡
Objective-Capp
數據請求框架
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]; // 建立請求 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 設置超時時間,可不設置,使用默認 request.timeOutSeconds = 5; // 發送同步請求 [request startSynchronous]; // 得到錯誤信息 NSError *error = [request error]; // 網絡請求失敗 if (error) { // 網絡請求成功 NSLog(@"網絡請求失敗:\n%@", error); } else { // 得到服務器的響應,字符串格式 NSString *responseString = [request responseString]; NSLog(@"網絡請求成功:\n%@", responseString); // 得到服務器的響應,NSData 格式 NSData *responseData = [request responseData]; textView.text = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; }
文件下載
若是你想獲取下載中的全部數據,能夠實現 delegate 中的 request:didReceiveData:方法。但若是你實現了這個方法,request 在下載完後,request 並不把文件放在 downloadDestinationPath中,須要手工處理。
NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/wp-content/uploads/2011/10/asihttprequest-auth.png"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 設置文件存儲路徑 [request setDownloadDestinationPath:@"/Users/JHQ0228/Desktop/asi.png"]; [request startSynchronous]; // 得到錯誤信息 NSError *error = [request error]; // 網絡請求失敗 if (error) { NSLog(@"網絡請求失敗:\n%@", error); } else { // 網絡請求成功 NSLog(@"網絡請求成功:\n"); }
請求在後臺線程中運行,當請求執行完後再通知調用的線程。這樣不會致使主線程進行網絡請求時,界面被鎖定等狀況。
協議方式
在這裏實現了兩個 delegate 的方法,當數據請求成功時會調用 requestFinished,請求失敗時(如網絡問題或服務器內部錯誤)會調用 requestFailed。
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]; // 建立請求 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 設置超時時間,可不設置,使用默認 request.timeOutSeconds = 5; // 設置代理,需遵照 <ASIHTTPRequestDelegate> 協議 request.delegate = self; // 發送異步請求 [request startAsynchronous]; // 網絡請求成功,協議方法 - (void)requestFinished:(ASIHTTPRequest *)request { } // 網絡請求失敗,協議方法 - (void)requestFailed:(ASIHTTPRequest *)request { }
Block 方式
在平臺支持狀況下,ASIHTTPRequest 1.8 以上支持 block。
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]; // 建立請求,加 __weak 除去 block 循環調用警告 __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; // 設置超時時間,可不設置,使用默認 request.timeOutSeconds = 5; // 發送異步請求 [request startAsynchronous]; // 網絡請求成功 [request setCompletionBlock:^{ }]; // 網絡請求失敗 [request setFailedBlock:^{ }];
POST 表單
ASIFormDataRequest,模擬 Form 表單提交,其提交格式與 Header 會自動識別。文件中的數據是須要時才從磁盤加載,因此只要 web server 能處理,那麼上傳大文件是沒有問題的。
// 一般數據是以 ’application/x-www-form-urlencoded’ 格式發送的,若是上傳了二進制數據或者文件,那麼格式將自動變爲 ‘multipart/form-data’。 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]]; // 沒有文件 [request setPostValue:@"Ben" forKey:@"first_name"]; [request setPostValue:@"Copsey" forKey:@"last_name"]; // 發送文件 [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; // 數據的 mime 頭是自動斷定的,可是若是你想自定義mime頭,那麼這樣: ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]]; // Upload a file on disk [request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"]; // Upload an NSData instance NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"myphoto.jpg"]); [request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"]; // 你可使用 addPostValue 方法來發送相同 name 的多個數據: ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]]; [request addPostValue:@"Ben" forKey:@"names"]; [request addPostValue:@"George" forKey:@"names"];
PUT 請求、自定義 POST 請求
若是你想發送 PUT 請求,或者你想自定義 POST 請求,使用 appendPostData: 或者 appendPostDataFromFile:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]]; [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]]; // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody: [request setRequestMethod:@"PUT"];