iOS網絡請求-NSURLConnection

一、NSURLConnection的常用類

NSURL:請求地址
NSURLRequest:封裝一個請求,保存發給服務器的全部數據,包括一個NSURL對象,請求方法、請求頭、請求體....
NSMutableURLRequest:NSURLRequest的子類
NSURLConnection:負責發送請求,建立客戶端和服務器的連接。發送NSURLRequest的數據給服務器,并收集來自服務器的響應數據

二、NSURLConnection的使用

1、簡單說明

使用NSURLConnection發送請求的步驟很簡單
(1)創建一個NSURL對象,設置請求路徑(設置請求路徑)
(2)傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體(創建請求對象)
(3)使用NSURLConnection發送NSURLRequest(發送請求)


2、代碼示例

2.1、發送請求的三個步驟:

1.設置請求路徑
2.創建請求對象
3.發送請求
3.1發送同步請求(一直在等待服務器返回數據,這行代碼會卡住,如果服務器,沒有返回數據,那么在主線程UI會卡住不能繼續執行操作)有返回值
3.2發送異步請求:沒有返回值
說明:任何NSURLRequest默認都是get請求

2.2、發送同步請求:
  //1.設置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
    
  //2.創建請求對象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
    
  //3.發送請求
    //發送同步請求,在主線程執行
    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //(一直在等待服務器返回數據,這行代碼會卡住,如果服務器沒有返回數據,那么在主線程UI會卡住不能繼續執行操作)
    
NSLog(@"--%d--",data.length);
2.3、發送異步請求

發送異步請求有兩種方式:
1)使用block回調
2)代理
A.使用block回調方法發送異步請求
使用block回調代碼示例:

  //1.設置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
    
  //2.創建請求對象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
     
  //3.發送請求
    //創建一個隊列(默認添加到該隊列中的任務異步執行)
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:queue 
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         
         NSLog(@"--block回調數據--%@---%d", [NSThread currentThread],data.length);
         
         //解析data
         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
         NSLog(@"%@",dict);
     }];

代碼說明:
block代碼段:當服務器有返回數據的時候調用會開一條新的線程去發送請求,主線程繼續往下走,當拿到服務器的返回數據的數據的時候再回調block,執行block代碼段。這種情況不會卡住主線程。
隊列的作用:決定這個block操作放在哪個線程執行?
刷新UI界面的操作應該放在主線程執行,不能放在子線程,在子線程處理UI相關操作會出現一些莫名的問題。
提示:
(1)創建一個操作,放在NSOperation隊列中執行,默認是異步執行的。
(2)mainqueue 返回一個和主線程相關的隊列,即主隊列。

B.使用代理方法發送異步請求
要監聽服務器返回的data,所以使用<NSURLConnectionDataDelegate>協議

使用異步方法發送get請求的示例:

 - (void)request
{
    //1.設置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
     
    //2創建請求對象
    //NSURLRequest *request=[NSURLRequest requestWithURL:url];//默認就是GET請求
     //設置請求超時
     NSMutableURLRequest *request = [NSMutableURLRequest  requestWithURL:url];
     request.timeoutInterval = 5.0;
     
    //3.發送請求
    //使用代理發送異步請求(通常應用于文件下載)
     NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
     [connection start];
     NSLog(@"已經發出請求");
 }
 
 #pragma mark- NSURLConnectionDataDelegate代理方法
 //當接收到服務器的響應(連通了服務器)時會調用
 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
     NSLog(@"接收到服務器的響應");
 }
 
 //當接收到服務器的數據時會調用(可能會被調用多次,每次只傳遞部分數據)
 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
     NSLog(@"接收到服務器的數據");
 }
 
//當服務器的數據加載完畢時就會調用
 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
     NSLog(@"服務器的數據加載完畢");
 }

 //請求錯誤(失敗)的時候調用(請求超時\斷網\沒有網\,一般指客戶端錯誤)
 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
      NSLog(@"請求錯誤");
 }

補充:
(1)數據的處理
在didReceiveData:方法中,拼接接收到的所有數據,等所有數據都拿到后,在connectionDidFinishLoading:方法中進行處理
(2)網絡延遲
在做網絡開發的時候,一定要考慮到網絡延遲情況的處理,可以在服務器的代碼設置一個斷點模擬。
在服務器代碼的登錄方法中設置斷點



設置請求的最大延遲


三、NSMutableURLRequest

NSMutableURLRequest是NSURLRequest的子類,常用方法有

//設置請求超時等待時間(超過這個時間就算超時,請求失敗)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;

//設置請求方法(比如GET和POST)
- (void)setHTTPMethod:(NSString *)method;

//設置請求體
- (void)setHTTPBody:(NSData *)data;

//設置請求頭
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容