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