文 || 張賀
NSURLConnection
NSURLConnection的基本使用
- 利用NSURLConnection進(jìn)行網(wǎng)絡(luò)請求分為3步:
- 創(chuàng)建請求路徑(NSURL)
- 創(chuàng)建請求對象(NSURLRequest)
- 發(fā)送請求(NSURLConnection)
發(fā)送同步請求
-
使用
sendSynchronousRequest: returningResponse: error:
方法發(fā)送一個(gè)同步請求枉长,該方法是阻塞式的會(huì)卡住線程。
//1.創(chuàng)建請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
//2.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.發(fā)送請求
NSURLResponse *response = nil;
NSError error = nil;
/
發(fā)送同步請求勾怒,阻塞式的方法糠聪,會(huì)卡住線程request : 請求對象 response : 響應(yīng)信息荒椭,當(dāng)該方法執(zhí)行完畢之后,該參數(shù)被賦值 error : 錯(cuò)誤信息舰蟆,如果請求失敗趣惠,則error有值 **/ NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"%@",response); //解析服務(wù)器返回的數(shù)據(jù) NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr);
發(fā)送異步請求
-
使用
sendAsynchronousRequest: queue: completionHandler:
方法發(fā)送一個(gè)異步請求。
//1.創(chuàng)建請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
//2.創(chuàng)建請求對象
NSURLRequest request = [NSURLRequest requestWithURL:url];
//3.發(fā)送請求
/
發(fā)送異步請求request : 請求對象 queue : 回調(diào)方法在哪個(gè)線程中執(zhí)行身害,如果是主隊(duì)列則block在主線程中執(zhí)行味悄,非主隊(duì)列則在子線程中執(zhí)行 completionHandler : 接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼 response:響應(yīng)頭信息 data:響應(yīng)體 connectionError:錯(cuò)誤信息,如果請求失敗塌鸯,那么該參數(shù)有值 **/ [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr); }];
通過設(shè)置代理發(fā)送異步請求
- 步驟:
01 侍瑟、確定請求路徑
02 、創(chuàng)建請求對象
03 界赔、創(chuàng)建NSURLConnection對象并設(shè)置代理
04 丢习、遵守NSURLConnectionDataDelegate協(xié)議牵触,并實(shí)現(xiàn)相應(yīng)的代理方法
05 、在代理方法中監(jiān)聽網(wǎng)絡(luò)請求的響應(yīng)
設(shè)置代理的3種方法
- 通過
[[NSURLConnection alloc]initWithRequest:request delegate:self];
設(shè)置代理咐低,通過這種方式設(shè)置代理將自動(dòng)發(fā)送網(wǎng)絡(luò)請求揽思。請求回來的結(jié)果在代理方法中拿到。 - 通過
[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
這種方法設(shè)置代理见擦,當(dāng)startImmediately設(shè)置為YES時(shí)自動(dòng)發(fā)送網(wǎng)絡(luò)請求钉汗,當(dāng)startImmediately設(shè)置為NO時(shí),需手動(dòng)調(diào)用- (void)start
方法發(fā)送網(wǎng)絡(luò)請求鲤屡。 - 通過
使用類方法connectionWithRequest: delegate:
設(shè)置代理损痰,會(huì)自動(dòng)發(fā)送網(wǎng)絡(luò)請求【评矗可以通過條用- (void)cancel;
方法取消網(wǎng)絡(luò)請求卢未。
相關(guān)的代理方法
/*
1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
第一個(gè)參數(shù)connection:監(jiān)聽的是哪個(gè)NSURLConnection對象
第二個(gè)參數(shù)response:接收到的服務(wù)器返回的響應(yīng)頭信息
*/
- (void)connection:(nonnull NSURLConnection *)connection
didReceiveResponse:(nonnull NSURLResponse *)response
/*
2.當(dāng)接收到數(shù)據(jù)的時(shí)候調(diào)用,該方法會(huì)被調(diào)用多次
第一個(gè)參數(shù)connection:監(jiān)聽的是哪個(gè)NSURLConnection對象
第二個(gè)參數(shù)data:本次接收到的服務(wù)端返回的二進(jìn)制數(shù)據(jù)(可能是片段)
*/
- (void)connection:(nonnull NSURLConnection *)connection
didReceiveData:(nonnull NSData *)data
/*
3.當(dāng)服務(wù)端返回的數(shù)據(jù)接收完畢之后會(huì)調(diào)用
通常在該方法中解析服務(wù)器返回的數(shù)據(jù)
*/
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection
/*4.當(dāng)請求錯(cuò)誤的時(shí)候調(diào)用(比如請求超時(shí))
第一個(gè)參數(shù)connection:NSURLConnection對象
第二個(gè)參數(shù):網(wǎng)絡(luò)請求的錯(cuò)誤信息堰汉,如果請求失敗辽社,則error有值
*/
- (void)connection:(nonnull NSURLConnection *)connection
didFailWithError:(nonnull NSError *)error
發(fā)送POST請求
-
需要改變請求對象(NSMutableURLRequest)的請求方法(HTTPMethod)以及設(shè)置請求體(HTTPBody)等。注意:這里需要使用可變的請求對象翘鸭。
//1.創(chuàng)建請求路徑 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"]; //2.創(chuàng)建可變請求對象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //更改請求方法 request.HTTPMethod = @"POST"; //設(shè)置具體的請求體 request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding]; //請求超時(shí) request.timeoutInterval = 5; //設(shè)置請求頭 [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"]; //3.發(fā)送請求 /* 發(fā)送異步請求 request : 請求對象 queue : 回調(diào)方法在哪個(gè)線程中執(zhí)行滴铅,如果是主隊(duì)列則block在主線程中執(zhí)行,非主隊(duì)列則在子線程中執(zhí)行 completionHandler : 接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼 response:響應(yīng)頭信息 data:響應(yīng)體 connectionError:錯(cuò)誤信息就乓,如果請求失敗汉匙,那么該參數(shù)有值 **/ [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { //4.解析服務(wù)器返回的數(shù)據(jù) if (connectionError) { NSLog(@"--請求失敗-"); }else { NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); } }];
小結(jié)
蘋果官方在iOS9以后已經(jīng)棄用了NSURLConnection,取而代之的是更為強(qiáng)大的NSURLSession生蚁。
NSURLSession
NSURLSession的基本使用
- 使用步驟:使用NSURLSession對象創(chuàng)建Task噩翠,然后執(zhí)行Task
- Task的類型:
- UIURLSessionTask是基類,要使用他的子類
NSURLSessionDataTask基本使用
-
通過
dataTaskWithRequest: completionHandler:
方法發(fā)送get/post請求
//1.創(chuàng)建請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
//2.創(chuàng)建可變請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//如果是post請求守伸,
//更改請求方法
//request.HTTPMethod = @"POST";
//設(shè)置具體的請求體
//request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];//3.創(chuàng)建NSURLSession NSURLSession *session = [NSURLSession sharedSession]; //根據(jù)session對象來創(chuàng)建task /* request:請求對象 completionHandler : 接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼 response:響應(yīng)頭信息 data:響應(yīng)體 error:錯(cuò)誤信息绎秒,如果請求失敗,那么該參數(shù)有值 **/ NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //這里的方法是在子線程內(nèi)執(zhí)行的 NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr); }]; //默認(rèn)創(chuàng)建出來task是暫停狀態(tài)尼摹,需要手動(dòng)啟動(dòng) [dataTask resume];
-
通過
dataTaskWithURL: completionHandler:
方法發(fā)送只能發(fā)送GET請求
//1.創(chuàng)建請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];//2.創(chuàng)建NSURLSession NSURLSession *session = [NSURLSession sharedSession]; //根據(jù)session對象來創(chuàng)建task /* url:內(nèi)部會(huì)自動(dòng)把url包裝成一個(gè)請求對象见芹,是get請求,如果是post請求就不能用這個(gè)方法了 completionHandler : 接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼 response:響應(yīng)頭信息 data:響應(yīng)體 error:錯(cuò)誤信息蠢涝,如果請求失敗玄呛,那么該參數(shù)有值 **/ NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr); }]; //默認(rèn)創(chuàng)建出來task是暫停狀態(tài),需要手動(dòng)啟動(dòng) [dataTask resume];
-
通過代理
//1.創(chuàng)建請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];//創(chuàng)建NSURLSession和二,并設(shè)置代理 /* configuration:配置信息 delegate:代理 queue:控制代理方法在哪個(gè)線程調(diào)用 **/ NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //創(chuàng)建task NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url]; //默認(rèn)創(chuàng)建出來task是暫停狀態(tài)徘铝,需要手動(dòng)啟動(dòng) [dataTask resume];
-
代理方法
#pragma mark 代理方法
//接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{/* NSURLSessionResponseCancel NSURLSessionResponseAllowcontinue NSURLSessionResponseBecomeDownload NSURLSessionResponseBecomeStream **/ //當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候,選擇要不要接收服務(wù)器返回的數(shù)據(jù) completionHandler(NSURLSessionResponseAllow); } //接收到服務(wù)器返回的數(shù)據(jù)的時(shí)候調(diào)用,該方法可能會(huì)被調(diào)用多次 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr); } //當(dāng)請求完成之后調(diào)用惕它,如果錯(cuò)誤怕午,那么error有值 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ }