網絡篇-NSURLConnection

簡介服務器

  • NSURLConnection:網絡

    做用:
        一、負責發送請求,創建客戶端和服務器的鏈接發送數據給服務器
        二、並收集來自服務器的響應數據
    步驟:
        一、建立一個NSURL對象,設置請求路徑
        二、傳入NSURL並建立一個NSURLRequest對象,設置請求頭和請求體
        三、使用NSURLConnection發送請求
  • 常見類
    ```objc
    一、NSURL:收納請求的地址app

    二、NSURLRequest:一個NSURLRequest對象就表明一個請求,它包含的信息有一個NSURL對象、請求方法、請求頭、請求體等等
    
      三、NSMutableURLRequest是NSURLRequest的子類
    ```
  • 發送請求
    • 同步請求
    -(void)sendSynchronousRequest{
        //一、建立一個URL
        //協議頭+主機地址+接口名稱+?+參數1&參數2&參數3
        //這裏的話是我本身使用.Net開發的一個本地後臺接口 http://192.168.1.0:8080/login?username=LitterL&pwd=123
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"];
    
        //二、建立請求(Request)對象(默認爲GET請求);
        NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url];
    
        //三、發送請求
        /*
         第一個參數:請求對象
         第二個參數:響應頭
         第三個參數:錯誤信息
         返回值:NSData類型,響應體信息
         */
        NSError *error = nil;
        NSURLResponse *response = nil;
        //發送同步請求(sendSynchronousRequest)
        NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error];
        //若是沒有錯誤就執行
        if (!error) {
            //打印的服務端返回的信息以及錯誤信息
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            NSLog(@"%@",error);
        }
    }

    補充:異步

    一、上面的話默認爲GET請求,能夠看到協議頭+主機地址+接口名稱+?+參數1&參數2,這裏的話教你們一個技巧,若是看到接口後面是帶問號(?)那麼就證實它爲GET請求,至於POST請求的話在異步請求裏面會告訴你們
    二、這裏的話默認是在主隊列執行的,爲同步請求,通常不建議你們使用這個,開發人員通常使用的方式是異步執行的,也就是下面這種方式,由於它是在後臺線程執行。
  • 異步請求函數

    -(void)sendAsynchronousRequest{
            //一、建立一個URL
            NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"];
    
            //二、建立請求(Request)對象 這裏使用的是它的子類NSMutableURLRequest,由於子類才具備設置方法和設置請求體的屬性
            NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url];
            //2.一、設置請求方法
            requst.HTTPMethod = @"POST";
            //2.二、設置請求體,由於傳入的爲Data數據全部這裏須要轉換
            requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
            //2.三、設置請求超時時間,若是超過這個時間,請求爲失敗
            requst.timeoutInterval = 10;
    
            //三、發送請求
    
            /*
             第一個參數:請求對象
             第二個參數:隊列
             第三個參數:Block回調函數
                response:響應頭
                data:響應體信息
                connectionError:錯誤信息
             */
    
            //發送異步請求(sendAsynchronousRequest)
            [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
                NSLog(@"----%@",[NSThread currentThread]);
    
                //解析數據
                NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            }];
        }


    補充:atom

    一、在這裏的話是咱們是使用了POST請求,然而使用POST請求那麼就必須的使用NSURLRequest的子類NSMutableURLRequest.
    二、只有在它的裏面才具備設置請求方法和方法體的屬性
  • 代理請求url

    • 簡述
    //若是你使用的是代理請求的話,那麼你須要知道四個方法:
        一、當接受到服務器響應的時候會調用:response(響應頭)
            -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
        二、當接受到服務器返回數據的時候調用(會調用屢次)
            - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
        三、當請求失敗的時候調用
            - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
        四、當請求結束(成功|失敗)的時候調用
            - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
    • 代碼
    一、首先實現代理,並定義一個NSData對象初始化,在請求結束的時候查看服務器傳來的內容,
        @interface ViewController ()<NSURLConnectionDataDelegate>
        /** 可變的二進制數據 */
        @property (nonatomic, strong) NSMutableData *fileData;
        @end
    
        /*
        懶加載
        */
        -(NSMutableData *)fileData{
            if (!_fileData) {
                _fileData = [[NSMutableData alloc]init];
            }
            return _fileData;
        }
    二、實現代理中的四個方法
        //1.當接受到服務器響應的時候會調用:response(響應頭)
        -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
        {
            NSLog(@"接受到相應");
        }
    
        //2.當接受到服務器返回數據的時候調用(會調用屢次)
        -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
        {
            //
            NSLog(@"接受到數據");
            //拼接數據
            [self.fileData appendData:data];
        }
    
        //3.當請求失敗的時候調用
        -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
        {
            NSLog(@"請求失敗");
        }
    
        //4.當請求結束(成功|失敗)的時候調用
        -(void)connectionDidFinishLoading:(NSURLConnection *)connection
        {
            NSLog(@"請求結束");
    
            //解析數據
            NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]);
        }
    三、最後編寫點擊時調用的方法
        -(void)sendRequestWithDelegate{
            //1.肯定請求路徑
            NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"];
            //2.建立請求對象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //三、代理請求
            /*
             第一個參數:請求對象
             第二個參數:誰成爲代理
             第三個參數:startImmediately :是否當即開始發送網絡請求
             */
            NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
            //[connect cancel]; 取消
            [connect start];
        }

結束線程

本章到此結束
            歡迎各位碼友隨意轉載並指正
相關文章
相關標籤/搜索