網(wǎng)絡(luò)01

網(wǎng)絡(luò)基礎(chǔ)

  • Http:
  • 蘋果原生:
  • NSURLConnection 03年推出的古老技術(shù)
  • NSURLSession 14年推出,為了代替NSURLConnection
  • CFNetwork c語言的,底層的
  • 第三方框架:
    • AFNetworking
  • NSURLConnection基本使用:
    • NSURLConnection同步請求(GET)
    • 發(fā)送網(wǎng)絡(luò)請求的步驟
      • 確定url
      • 創(chuàng)建請求
      • 發(fā)送NSURLSession sendsync同步請求
      • 服務(wù)器得到消息后解析內(nèi)容
    • 相關(guān)代碼:
         //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
        //NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
      
        //2.創(chuàng)建一個請求對象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
      
        //3.把請求發(fā)送給服務(wù)器
        //sendSynchronousRequest  阻塞式的方法,會卡住線程
      
        NSHTTPURLResponse *response = nil;
        NSError *error = nil;
      
        /*
        第一個參數(shù):請求對象
        第二個參數(shù):響應(yīng)頭信息,當(dāng)該方法執(zhí)行完畢之后,該參數(shù)被賦值
        第三個參數(shù):錯誤信息,如果請求失敗,則error有值
        */
        //該方法是阻塞式的,會卡住線程
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
      
        //4.解析服務(wù)器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
      
  • NSURLConnection異步請求(GET-SendAsync)
    • 相關(guān)說明:該請求是異步的,不會卡在當(dāng)前線程
  • 相關(guān)代碼:
      //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];
    
        //2.創(chuàng)建一個請求對象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //3.把請求發(fā)送給服務(wù)器,發(fā)送一個異步請求
        /*
        第一個參數(shù):請求對象
        第二個參數(shù):回調(diào)方法在哪個線程中執(zhí)行,如果是主隊列則block在主線程中執(zhí)行,非主隊列則在子線程中執(zhí)行
        第三個參數(shù):completionHandlerBlock塊:接受到響應(yīng)的時候執(zhí)行該block中的代碼
                response:響應(yīng)頭信息
                data:響應(yīng)體
                connectionError:錯誤信息,如果請求失敗,那么該參數(shù)有值
             */
        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
    
        //4.解析服務(wù)器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            //轉(zhuǎn)換并打印響應(yīng)頭信息
            NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
            NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
        }];
    
  • NSURLConnection異步請求(代理)
  • 步驟:
    • 確定url路徑
    • 創(chuàng)建request請求對象
    • 創(chuàng)建NSURLConnection對象,并設(shè)置代理
    • 遵守NSURLConnectionDelegate協(xié)議,并實現(xiàn)代理方法 - 在代理方法中監(jiān)聽網(wǎng)絡(luò)請求
  • 設(shè)置代理的幾種方法:
      /*
      設(shè)置代理的第一種方式:自動發(fā)送網(wǎng)絡(luò)請求
      [[NSURLConnection alloc]initWithRequest:request delegate:self];
      */
    
     /*
      設(shè)置代理的第二種方式:
      第一個參數(shù):請求對象
      第二個參數(shù):誰成為NSURLConnetion對象的代理
      第三個參數(shù):是否馬上發(fā)送網(wǎng)絡(luò)請求,如果該值為YES則立刻發(fā)送,如果為NO則不會發(fā)送網(wǎng)路請求
      NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    
      //調(diào)用該方法控制網(wǎng)絡(luò)請求的發(fā)送
      [conn start];
      */
    
     //設(shè)置代理的第三種方式:使用類方法設(shè)置代理,會自動發(fā)送網(wǎng)絡(luò)請求
     NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
     //取消網(wǎng)絡(luò)請求
     //[conn cancel];
    
  • 相關(guān)代理方法:
  /*
      1.當(dāng)接收到服務(wù)器響應(yīng)的時候調(diào)用
      第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
      第二個參數(shù)response:接收到的服務(wù)器返回的響應(yīng)頭信息
      */
     - (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

     /*
      2.當(dāng)接收到數(shù)據(jù)的時候調(diào)用,該方法會被調(diào)用多次
      第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
      第二個參數(shù)data:本次接收到的服務(wù)端返回的二進(jìn)制數(shù)據(jù)(可能是片段)
      */
     - (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
     /*

      3.當(dāng)服務(wù)端返回的數(shù)據(jù)接收完畢之后會調(diào)用
      通常在該方法中解析服務(wù)器返回的數(shù)據(jù)
      */
     -(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

     /*4.當(dāng)請求錯誤的時候調(diào)用(比如請求超時)
      第一個參數(shù)connection:NSURLConnection對象
      第二個參數(shù):網(wǎng)絡(luò)請求的錯誤信息,如果請求失敗,則error有值
      */
     - (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error

  • 其它知識點
    • 關(guān)于消息彈窗第三方框架的使用
      SVProgressHUD
    • 字符串截取相關(guān)方法
       - (NSRange)rangeOfString:(NSString *)searchString;
       - (NSString *)substringWithRange:(NSRange)range;
    
  • NSURLConnection發(fā)送POST請求
    • 發(fā)送POST請求對象方法
    • 確定請求路徑
    • 創(chuàng)建可變請求對象
    • 修改請求方法為POST,設(shè)置請求體(data)
    • 發(fā)送異步請求
    • 相關(guān)代碼
      //1.確定請求路徑
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
        //2.創(chuàng)建請求對象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
        //2.1更改請求方法
        request.HTTPMethod = @"POST";
    
        //2.2設(shè)置請求體
        request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];
    
        //2.3請求超時
        request.timeoutInterval = 5;
    
        //2.4設(shè)置請求頭
        [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];
    
        //3.發(fā)送請求
        [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]);
            }
        }];
    
  • url中文轉(zhuǎn)碼問題:
      //1.確定請求路徑
    NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it";
    NSLog(@"%@",urlStr);
    //中文轉(zhuǎn)碼操作
    urlStr =  [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@",urlStr);
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
  • NSURLConnection和RunLoop(面試)
    • 兩種為NSURLConnection設(shè)置代理的區(qū)別
      //第一種設(shè)置方式:
    //通過該方法設(shè)置代理,會自動的發(fā)送請求
    // [[NSURLConnection alloc]initWithRequest:request delegate:self];
    
    //第二種設(shè)置方式:
    //設(shè)置代理,startImmediately為NO的時候,該方法不會自動發(fā)送請求
    NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    //手動通過代碼的方式來發(fā)送請求
    //注意該方法內(nèi)部會自動的把connect添加到當(dāng)前線程的RunLoop中在默認(rèn)模式下執(zhí)行
    [connect start];
    
    • 如何控制代理方法在哪個線程調(diào)用
      //說明:默認(rèn)情況下,代理方法會在主線程中進(jìn)行調(diào)用(為了方便開發(fā)者拿到數(shù)據(jù)后處理一些刷新UI的操作不需要考慮到線程間通信)
    //設(shè)置代理方法的執(zhí)行隊列
    [connect setDelegateQueue:[[NSOperationQueue alloc]init]];
    
    • 開子線程發(fā)送網(wǎng)絡(luò)請求的注意點,適用于自動發(fā)送網(wǎng)絡(luò)請求:
      //在子線程中發(fā)送網(wǎng)絡(luò)請求-調(diào)用startf方法發(fā)送
    -(void)createNewThreadSendConnect1
    {
        //1.創(chuàng)建一個非主隊列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        //2.封裝操作,并把任務(wù)添加到隊列中執(zhí)行
        [queue addOperationWithBlock:^{
    
            NSLog(@"%@",[NSThread currentThread]);
            //2-1.確定請求路徑
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
            //2-2.創(chuàng)建請求對象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //2-3.使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求
            NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
    
            //2-4.設(shè)置代理方法在哪個隊列中執(zhí)行,如果是非主隊列,那么代理方法將再子線程中執(zhí)行
            [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
            //2-5.發(fā)送網(wǎng)絡(luò)請求
            //注意:start方法內(nèi)部會把當(dāng)前的connect對象作為一個source添加到當(dāng)前線程對應(yīng)的runloop中
            //區(qū)別在于,如果調(diào)用start方法開發(fā)送網(wǎng)絡(luò)請求,那么再添加source的過程中,如果當(dāng)前runloop不存在
            //那么該方法內(nèi)部會自動創(chuàng)建一個當(dāng)前線程對應(yīng)的runloop,并啟動。
            [connection start];
    
        }];
    }
    
    //在子線程中發(fā)送網(wǎng)絡(luò)請求-自動發(fā)送網(wǎng)絡(luò)請求
    -(void)createNewThreadSendConnect2
    {
        NSLog(@"-----");
        //1.創(chuàng)建一個非主隊列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        //2.封裝操作,并把任務(wù)添加到隊列中執(zhí)行
        [queue addOperationWithBlock:^{
    
            //2-1.確定請求路徑
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
            //2-2.創(chuàng)建請求對象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //2-3.使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求
            //注意:該方法內(nèi)部雖然會把connection添加到runloop,但是如果當(dāng)前的runloop不存在,那么不會主動創(chuàng)建。
            NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    
            //2-4.設(shè)置代理方法在哪個隊列中執(zhí)行,如果是非主隊列,那么代理方法將再子線程中執(zhí)行
            [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
            //2-5 創(chuàng)建當(dāng)前線程對應(yīng)的runloop,并開啟
           [[NSRunLoop currentRunLoop]run];
        }];
    }
    
  • NSURLSession的基本使用
      //在子線程中發(fā)送網(wǎng)絡(luò)請求-調(diào)用startf方法發(fā)送
      -(void)createNewThreadSendConnect1
      {
          //1.創(chuàng)建一個非主隊列
          NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
          //2.封裝操作,并把任務(wù)添加到隊列中執(zhí)行
          [queue addOperationWithBlock:^{
    
              NSLog(@"%@",[NSThread currentThread]);
              //2-1.確定請求路徑
              NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
              //2-2.創(chuàng)建請求對象
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
              //2-3.使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求
              NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
    
              //2-4.設(shè)置代理方法在哪個隊列中執(zhí)行,如果是非主隊列,那么代理方法將再子線程中執(zhí)行
              [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
              //2-5.發(fā)送網(wǎng)絡(luò)請求
              //注意:start方法內(nèi)部會把當(dāng)前的connect對象作為一個source添加到當(dāng)前線程對應(yīng)的runloop中
              //區(qū)別在于,如果調(diào)用start方法開發(fā)送網(wǎng)絡(luò)請求,那么再添加source的過程中,如果當(dāng)前runloop不存在
              //那么該方法內(nèi)部會自動創(chuàng)建一個當(dāng)前線程對應(yīng)的runloop,并啟動。
              [connection start];
    
          }];
      }
    
      //在子線程中發(fā)送網(wǎng)絡(luò)請求-自動發(fā)送網(wǎng)絡(luò)請求
      -(void)createNewThreadSendConnect2
      {
          NSLog(@"-----");
          //1.創(chuàng)建一個非主隊列
          NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
          //2.封裝操作,并把任務(wù)添加到隊列中執(zhí)行
          [queue addOperationWithBlock:^{
    
              //2-1.確定請求路徑
              NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=dd&pwd=ww&type=JSON"];
    
              //2-2.創(chuàng)建請求對象
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
              //2-3.使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求
              //注意:該方法內(nèi)部雖然會把connection添加到runloop,但是如果當(dāng)前的runloop不存在,那么不會主動創(chuàng)建。
              NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    
              //2-4.設(shè)置代理方法在哪個隊列中執(zhí)行,如果是非主隊列,那么代理方法將再子線程中執(zhí)行
              [connection setDelegateQueue:[[NSOperationQueue alloc]init]];
    
              //2-5 創(chuàng)建當(dāng)前線程對應(yīng)的runloop,并開啟
             [[NSRunLoop currentRunLoop]run];
          }];
      }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容