iOS網(wǎng)絡(luò)篇-NSURLConnection

簡(jiǎn)介

  • NSURLConnection:

    作用:
        1、負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接發(fā)送數(shù)據(jù)給服務(wù)器
        2、并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)
    步驟:
        1、創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑
        2、傳入NSURL并創(chuàng)建一個(gè)NSURLRequest對(duì)象,設(shè)置請(qǐng)求頭和請(qǐng)求體
        3、使用NSURLConnection發(fā)送請(qǐng)求
    
  • 常見(jiàn)類

        1、NSURL:收納請(qǐng)求的地址
    
        2、NSURLRequest:一個(gè)NSURLRequest對(duì)象就代表一個(gè)請(qǐng)求,它包含的信息有一個(gè)NSURL對(duì)象、請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體等等
    
        3、NSMutableURLRequest是NSURLRequest的子類
    
  • 發(fā)送請(qǐng)求

    • 同步請(qǐng)求
    -(void)sendSynchronousRequest{
        //1、創(chuàng)建一個(gè)URL
        //協(xié)議頭+主機(jī)地址+接口名稱+?+參數(shù)1&參數(shù)2&參數(shù)3
        //這里的話是我自己使用.Net開發(fā)的一個(gè)本地后臺(tái)接口 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、創(chuàng)建請(qǐng)求(Request)對(duì)象(默認(rèn)為GET請(qǐng)求);
        NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url];
    
        //3、發(fā)送請(qǐng)求
        /*
         第一個(gè)參數(shù):請(qǐng)求對(duì)象
         第二個(gè)參數(shù):響應(yīng)頭
         第三個(gè)參數(shù):錯(cuò)誤信息
         返回值:NSData類型,響應(yīng)體信息
         */
        NSError *error = nil;
        NSURLResponse *response = nil;
        //發(fā)送同步請(qǐng)求(sendSynchronousRequest)
        NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error];
        //如果沒(méi)有錯(cuò)誤就執(zhí)行
        if (!error) {
            //打印的服務(wù)端返回的信息以及錯(cuò)誤信息
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            NSLog(@"%@",error);
        }
    }
    
    圖-1

    補(bǔ)充:

    1、上面的話默認(rèn)為GET請(qǐng)求,可以看到協(xié)議頭+主機(jī)地址+接口名稱+?+參數(shù)1&參數(shù)2,這里的話教大家一個(gè)技巧,如果看到接口后面是帶問(wèn)號(hào)(?)那么就證明它為GET請(qǐng)求,至于POST請(qǐng)求的話在異步請(qǐng)求里面會(huì)告訴大家
    2、這里的話默認(rèn)是在主隊(duì)列執(zhí)行的,為同步請(qǐng)求,一般不建議大家使用這個(gè),開發(fā)人員一般使用的方式是異步執(zhí)行的,也就是下面這種方式,因?yàn)樗窃诤笈_(tái)線程執(zhí)行。
    
  • 異步請(qǐng)求

        -(void)sendAsynchronousRequest{
            //1、創(chuàng)建一個(gè)URL
            NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"];
    
            //2、創(chuàng)建請(qǐng)求(Request)對(duì)象 這里使用的是它的子類NSMutableURLRequest,因?yàn)樽宇惒啪哂性O(shè)置方法和設(shè)置請(qǐng)求體的屬性
            NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url];
            //2.1、設(shè)置請(qǐng)求方法
            requst.HTTPMethod = @"POST";
            //2.2、設(shè)置請(qǐng)求體,因?yàn)閭魅氲臑镈ata數(shù)據(jù)所有這里需要轉(zhuǎn)換
            requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
            //2.3、設(shè)置請(qǐng)求超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間,請(qǐng)求為失敗
            requst.timeoutInterval = 10;
    
            //3、發(fā)送請(qǐng)求
    
            /*
             第一個(gè)參數(shù):請(qǐng)求對(duì)象
             第二個(gè)參數(shù):隊(duì)列
             第三個(gè)參數(shù):Block回調(diào)函數(shù)
                response:響應(yīng)頭
                data:響應(yīng)體信息
                connectionError:錯(cuò)誤信息
             */
    
            //發(fā)送異步請(qǐng)求(sendAsynchronousRequest)
            [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
                NSLog(@"----%@",[NSThread currentThread]);
    
                //解析數(shù)據(jù)
                NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            }];
        }
    
    圖-2

    補(bǔ)充:

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

    • 簡(jiǎn)述
        //如果你使用的是代理請(qǐng)求的話,那么你需要知道四個(gè)方法:
        1、當(dāng)接受到服務(wù)器響應(yīng)的時(shí)候會(huì)調(diào)用:response(響應(yīng)頭)
            -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
        2、當(dāng)接受到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候調(diào)用(會(huì)調(diào)用多次)
            - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
        3、當(dāng)請(qǐng)求失敗的時(shí)候調(diào)用
            - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
        4、當(dāng)請(qǐng)求結(jié)束(成功|失敗)的時(shí)候調(diào)用
            - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
    
    • 代碼
    1、首先實(shí)現(xiàn)代理,并定義一個(gè)NSData對(duì)象初始化,在請(qǐng)求結(jié)束的時(shí)候查看服務(wù)器傳來(lái)的內(nèi)容,
        @interface ViewController ()<NSURLConnectionDataDelegate>
        /** 可變的二進(jìn)制數(shù)據(jù) */
        @property (nonatomic, strong) NSMutableData *fileData;
        @end
    
        /*
        懶加載
        */
        -(NSMutableData *)fileData{
            if (!_fileData) {
                _fileData = [[NSMutableData alloc]init];
            }
            return _fileData;
        }
    2、實(shí)現(xiàn)代理中的四個(gè)方法
        //1.當(dāng)接受到服務(wù)器響應(yīng)的時(shí)候會(huì)調(diào)用:response(響應(yīng)頭)
        -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
        {
            NSLog(@"接受到相應(yīng)");
        }
    
        //2.當(dāng)接受到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候調(diào)用(會(huì)調(diào)用多次)
        -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
        {
            //
            NSLog(@"接受到數(shù)據(jù)");
            //拼接數(shù)據(jù)
            [self.fileData appendData:data];
        }
    
        //3.當(dāng)請(qǐng)求失敗的時(shí)候調(diào)用
        -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
        {
            NSLog(@"請(qǐng)求失敗");
        }
    
        //4.當(dāng)請(qǐng)求結(jié)束(成功|失敗)的時(shí)候調(diào)用
        -(void)connectionDidFinishLoading:(NSURLConnection *)connection
        {
            NSLog(@"請(qǐng)求結(jié)束");
    
            //解析數(shù)據(jù)
            NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]);
        }
    3、最后編寫點(diǎn)擊時(shí)調(diào)用的方法
        -(void)sendRequestWithDelegate{
            //1.確定請(qǐng)求路徑
            NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"];
            //2.創(chuàng)建請(qǐng)求對(duì)象
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
            //3、代理請(qǐng)求
            /*
             第一個(gè)參數(shù):請(qǐng)求對(duì)象
             第二個(gè)參數(shù):誰(shuí)成為代理
             第三個(gè)參數(shù):startImmediately :是否立即開始發(fā)送網(wǎng)絡(luò)請(qǐng)求
             */
            NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
            //[connect cancel]; 取消
            [connect start];
        }
    
    圖-3

結(jié)束

                  本章到此結(jié)束
            歡迎各位碼友隨意轉(zhuǎn)載并指正
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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