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


