簡介
-
NSURLConnection:
作用: 1、負責發送請求,建立客戶端和服務器的連接發送數據給服務器 2、并收集來自服務器的響應數據 步驟: 1、創建一個NSURL對象,設置請求路徑 2、傳入NSURL并創建一個NSURLRequest對象,設置請求頭和請求體 3、使用NSURLConnection發送請求
-
常見類
1、NSURL:收納請求的地址 2、NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有一個NSURL對象、請求方法、請求頭、請求體等等 3、NSMutableURLRequest是NSURLRequest的子類
-
發送請求
- 同步請求
-(void)sendSynchronousRequest{ //1、創建一個URL //協議頭+主機地址+接口名稱+?+參數1&參數2&參數3 //這里的話是我自己使用.Net開發的一個本地后臺接口 http://192.168.1.0:8080/login?username=LitterL&pwd=123 NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"]; //2、創建請求(Request)對象(默認為GET請求); NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url]; //3、發送請求 /* 第一個參數:請求對象 第二個參數:響應頭 第三個參數:錯誤信息 返回值:NSData類型,響應體信息 */ NSError *error = nil; NSURLResponse *response = nil; //發送同步請求(sendSynchronousRequest) NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error]; //如果沒有錯誤就執行 if (!error) { //打印的服務端返回的信息以及錯誤信息 NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); NSLog(@"%@",error); } }
圖-1補充:
1、上面的話默認為GET請求,可以看到協議頭+主機地址+接口名稱+?+參數1&參數2,這里的話教大家一個技巧,如果看到接口后面是帶問號(?)那么就證明它為GET請求,至于POST請求的話在異步請求里面會告訴大家 2、這里的話默認是在主隊列執行的,為同步請求,一般不建議大家使用這個,開發人員一般使用的方式是異步執行的,也就是下面這種方式,因為它是在后臺線程執行。
-
異步請求
-(void)sendAsynchronousRequest{ //1、創建一個URL NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"]; //2、創建請求(Request)對象 這里使用的是它的子類NSMutableURLRequest,因為子類才具有設置方法和設置請求體的屬性 NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url]; //2.1、設置請求方法 requst.HTTPMethod = @"POST"; //2.2、設置請求體,因為傳入的為Data數據所有這里需要轉換 requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding]; //2.3、設置請求超時時間,如果超過這個時間,請求為失敗 requst.timeoutInterval = 10; //3、發送請求 /* 第一個參數:請求對象 第二個參數:隊列 第三個參數:Block回調函數 response:響應頭 data:響應體信息 connectionError:錯誤信息 */ //發送異步請求(sendAsynchronousRequest) [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSLog(@"----%@",[NSThread currentThread]); //解析數據 NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); }]; }
圖-2補充:
1、在這里的話是我們是使用了POST請求,然而使用POST請求那么就必須的使用NSURLRequest的子類NSMutableURLRequest. 2、只有在它的里面才具有設置請求方法和方法體的屬性
-
代理請求
- 簡述
//如果你使用的是代理請求的話,那么你需要知道四個方法: 1、當接受到服務器響應的時候會調用:response(響應頭) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 2、當接受到服務器返回數據的時候調用(會調用多次) - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 3、當請求失敗的時候調用 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 4、當請求結束(成功|失敗)的時候調用 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- 代碼
1、首先實現代理,并定義一個NSData對象初始化,在請求結束的時候查看服務器傳來的內容, @interface ViewController ()<NSURLConnectionDataDelegate> /** 可變的二進制數據 */ @property (nonatomic, strong) NSMutableData *fileData; @end /* 懶加載 */ -(NSMutableData *)fileData{ if (!_fileData) { _fileData = [[NSMutableData alloc]init]; } return _fileData; } 2、實現代理中的四個方法 //1.當接受到服務器響應的時候會調用:response(響應頭) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"接受到相應"); } //2.當接受到服務器返回數據的時候調用(會調用多次) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // NSLog(@"接受到數據"); //拼接數據 [self.fileData appendData:data]; } //3.當請求失敗的時候調用 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"請求失敗"); } //4.當請求結束(成功|失敗)的時候調用 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"請求結束"); //解析數據 NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]); } 3、最后編寫點擊時調用的方法 -(void)sendRequestWithDelegate{ //1.確定請求路徑 NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"]; //2.創建請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3、代理請求 /* 第一個參數:請求對象 第二個參數:誰成為代理 第三個參數:startImmediately :是否立即開始發送網絡請求 */ NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO]; //[connect cancel]; 取消 [connect start]; }
圖-3
結束
本章到此結束
歡迎各位碼友隨意轉載并指正