iOS網絡篇-NSURLConnection

簡介

  • NSURLConnection:

    作用:
        1、負責發送請求,建立客戶端和服務器的連接發送數據給服務器
        2、并收集來自服務器的響應數據
    步驟:
        1、創建一個NSURL對象,設置請求路徑
        2、傳入NSURL并創建一個NSURLRequest對象,設置請求頭和請求體
        3、使用NSURLConnection發送請求
    
  • 常見類

        1、NSURL:收納請求的地址
    
        2、NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有一個NSURL對象、請求方法、請求頭、請求體等等
    
        3、NSMutableURLRequest是NSURLRequest的子類
    
  • 發送請求

    • 同步請求
    -(void)sendSynchronousRequest{
        //1、創建一個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"];
    
        //2、創建請求(Request)對象(默認為GET請求);
        NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url];
    
        //3、發送請求
        /*
         第一個參數:請求對象
         第二個參數:響應頭
         第三個參數:錯誤信息
         返回值: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);
        }
    }
    
    圖-1

    補充:

    1、上面的話默認為GET請求,可以看到協議頭+主機地址+接口名稱+?+參數1&參數2,這里的話教大家一個技巧,如果看到接口后面是帶問號(?)那么就證明它為GET請求,至于POST請求的話在異步請求里面會告訴大家
    2、這里的話默認是在主隊列執行的,為同步請求,一般不建議大家使用這個,開發人員一般使用的方式是異步執行的,也就是下面這種方式,因為它是在后臺線程執行。
    
  • 異步請求

        -(void)sendAsynchronousRequest{
            //1、創建一個URL
            NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"];
    
            //2、創建請求(Request)對象 這里使用的是它的子類NSMutableURLRequest,因為子類才具有設置方法和設置請求體的屬性
            NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url];
            //2.1、設置請求方法
            requst.HTTPMethod = @"POST";
            //2.2、設置請求體,因為傳入的為Data數據所有這里需要轉換
            requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
            //2.3、設置請求超時時間,如果超過這個時間,請求為失敗
            requst.timeoutInterval = 10;
    
            //3、發送請求
    
            /*
             第一個參數:請求對象
             第二個參數:隊列
             第三個參數: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]);
            }];
        }
    
    圖-2

    補充:

    1、在這里的話是我們是使用了POST請求,然而使用POST請求那么就必須的使用NSURLRequest的子類NSMutableURLRequest.
    2、只有在它的里面才具有設置請求方法和方法體的屬性
    
  • 代理請求

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

結束

                  本章到此結束
            歡迎各位碼友隨意轉載并指正
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容