一、NSURLConnection的常用類
(1)NSURL:請(qǐng)求地址
(2)NSURLRequest:封裝一個(gè)請(qǐng)求,保存發(fā)給服務(wù)器的全部數(shù)據(jù),包括一個(gè)NSURL對(duì)象,請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體....
(3)NSMutableURLRequest:NSURLRequest的子類
(4)NSURLConnection:負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接。發(fā)送NSURLRequest的數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)
二、NSURLConnection的使用
使用NSURLConnection發(fā)送請(qǐng)求的步驟很簡(jiǎn)單
(1)創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑(設(shè)置請(qǐng)求路徑)
(2)傳入NSURL創(chuàng)建一個(gè)NSURLRequest對(duì)象,設(shè)置請(qǐng)求頭和請(qǐng)求體(創(chuàng)建請(qǐng)求對(duì)象)
(3)使用NSURLConnection發(fā)送NSURLRequest(發(fā)送請(qǐng)求)
2.代碼示例
(1)發(fā)送請(qǐng)求的三個(gè)步驟:
1.設(shè)置請(qǐng)求路徑
2.創(chuàng)建請(qǐng)求對(duì)象
3.發(fā)送請(qǐng)求
3.1發(fā)送同步請(qǐng)求(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會(huì)卡住,如果服務(wù)器,沒(méi)有返回?cái)?shù)據(jù),那么在主線程UI會(huì)卡住不能繼續(xù)執(zhí)行操作)有返回值
3.2發(fā)送異步請(qǐng)求:沒(méi)有返回值
說(shuō)明:任何NSURLRequest默認(rèn)都是get請(qǐng)求。
通過(guò)NSURLConnection訪問(wèn)服務(wù)器,三步:
1.設(shè)置請(qǐng)求路徑? 創(chuàng)建一個(gè)URL:統(tǒng)一資源定位符
注意這里一定要加http協(xié)議
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
2.創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3.建立連接,發(fā)送請(qǐng)求
接收數(shù)據(jù)的代理方法
1.建立一個(gè)同步請(qǐng)求(如果數(shù)據(jù)大或者網(wǎng)速慢,請(qǐng)求事件過(guò)長(zhǎng),會(huì)造成主線程阻塞(卡死))
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//NSUTF8StringEncoding將data編碼為當(dāng)前語(yǔ)言環(huán)境下的語(yǔ)言
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"----------------------%@", str);
NSLog(@"----------繼續(xù)執(zhí)行----------");
//對(duì)于網(wǎng)絡(luò)請(qǐng)求分為同步和異步兩種,同步是指在請(qǐng)求結(jié)果返回之前,程序代碼會(huì)卡在請(qǐng)求處,之后的代碼不會(huì)被執(zhí)行,異步是指在發(fā)送請(qǐng)求之后,一邊在子線程中接收返回?cái)?shù)據(jù),一邊執(zhí)行之后的代碼,當(dāng)返回?cái)?shù)據(jù)接收完畢后,采用回調(diào)的方式通知主線程做處理。
2、建立一個(gè)異步請(qǐng)求
創(chuàng)建隊(duì)列(開(kāi)啟一個(gè)新的線程)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"訪問(wèn)網(wǎng)頁(yè)返回的數(shù)據(jù) ------- %@", str);
dispatch_async(dispatch_get_main_queue(), ^{
[_web loadHTMLString:str baseURL:nil];
});
}];
3.使用代理
? ? [NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark - NSURLConnectionDelegate,NSURLConnectionDataDelegate
當(dāng)你接收到服務(wù)器的響應(yīng)(連通了服務(wù)器)會(huì)調(diào)用,(服務(wù)器告訴客戶端,我這邊準(zhǔn)備好了,可以給你返回?cái)?shù)據(jù)了)
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"---------響應(yīng)");
//創(chuàng)建可變數(shù)據(jù)對(duì)象,用來(lái)接收拼接返回的數(shù)據(jù)
_buffer = [[NSMutableData alloc] init];
}
//當(dāng)接收到服務(wù)器發(fā)送的數(shù)據(jù)時(shí)會(huì)調(diào)用,(可能會(huì)被調(diào)用多次,每次只會(huì)傳遞部分?jǐn)?shù)據(jù))
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"---------數(shù)據(jù)");
//使用創(chuàng)建的好的buffer對(duì)象接受拼接數(shù)據(jù)
[_buffer appendData:data];
}
當(dāng)數(shù)據(jù)全部接收完畢的時(shí)候會(huì)調(diào)用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"---------結(jié)束");
NSString *str = [[NSString alloc] initWithData:_buffer encoding:NSUTF8StringEncoding];
//#pragma unused(str)
}
請(qǐng)求失敗調(diào)用(請(qǐng)求超時(shí),斷網(wǎng),參數(shù)錯(cuò)誤,服務(wù)器出錯(cuò).....)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro {
NSLog(@"請(qǐng)求失敗");
}
NSURLConnection的常用類
(1)NSURL:請(qǐng)求路徑? -- 統(tǒng)一資源定位符
(2)NSURLRequest:請(qǐng)求對(duì)象,保存發(fā)給服務(wù)器的全部數(shù)據(jù),包括一個(gè)NSURL對(duì)象,請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體....
(3)NSMutableURLRequest:NSURLRequest的子類
(4)NSURLConnection:負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接。發(fā)送NSURLRequest的數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)
3.1發(fā)送同步請(qǐng)求(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會(huì)卡住,如果服務(wù)器,沒(méi)有返回?cái)?shù)據(jù),那么在主線程UI會(huì)卡住不能繼續(xù)執(zhí)行操作)有返回值
3.2發(fā)送異步請(qǐng)求:沒(méi)有返回值
(3)發(fā)送異步請(qǐng)求??? 發(fā)送異步請(qǐng)求有兩種方式:
1)使用block回調(diào)
2)代理???? (例子見(jiàn)下面小Demo)
三、NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子類,常用方法有
設(shè)置請(qǐng)求超時(shí)等待時(shí)間(超過(guò)這個(gè)時(shí)間就算超時(shí),請(qǐng)求失敗)- (void)setTimeoutInterval:(NSTimeInterval)seconds;
設(shè)置請(qǐng)求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;
設(shè)置請(qǐng)求體- (void)setHTTPBody:(NSData *)data;
設(shè)置請(qǐng)求頭- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
1.使用block的方式進(jìn)行異步請(qǐng)求
使用如下代碼進(jìn)行block方式的異步請(qǐng)求,在block中會(huì)傳入請(qǐng)求到的返回?cái)?shù)據(jù)和數(shù)據(jù)信息等參數(shù):
NSURL* url = [NSURLURLWithString:@"http://www.baidu.com"];
NSURLRequest* request = [NSURLRequestrequestWithURL:url];
//其中的queue參數(shù)決定block中的代碼在哪個(gè)隊(duì)列中執(zhí)行[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse* _Nullable response,NSData* _Nullable data,NSError* _Nullable connectionError)
{NSLog(@"%@",data);??
}];
NSLog(@"繼續(xù)執(zhí)行");
2.使用代理回調(diào)的異步請(qǐng)求方式
首先遵守協(xié)議與生命一個(gè)可變的NSData用于接收數(shù)據(jù):
@interfaceViewController (){? ?
NSMutableData * _data;
}
@end
使用如下的代碼進(jìn)行請(qǐng)求:
_data = [[NSMutableDataalloc]init];NSURL* url = [NSURLURLWithString:@"http://www.baidu.com"];NSURLRequest* request = [NSURLRequestrequestWithURL:url];? ? [NSURLConnectionconnectionWithRequest:request delegate:self];
請(qǐng)求發(fā)出后,會(huì)一次調(diào)用如下代理方法進(jìn)行請(qǐng)求過(guò)程的監(jiān)聽(tīng)和數(shù)據(jù)的獲取:
-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{
//開(kāi)始接收數(shù)據(jù)[_data setLength:0];
}
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{
//正在接收數(shù)據(jù)[_data appendData:data];
}
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error{
//接收數(shù)據(jù)失敗NSLog(@"%@",error);
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection{
//接收數(shù)據(jù)完成NSLog(@"%@",_data);
}
本文能更新的的就這些了,都是一些基礎(chǔ)的代碼案例