NSURLConnection使用

NSURLConnection的使用

  • NSURL:請(qǐng)求地址
  • NSURLRequest:一個(gè)NSURLRequest對(duì)象就代表一個(gè)請(qǐng)求,它包含的信息有;
    • 一個(gè)NSURL對(duì)象
    • 請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體
    • 請(qǐng)求超時(shí)
    • ...
  • NSMutableURLRequest:NSURLRequest的子類
  • NSURLConnection
    • 負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接
    • 發(fā)送數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)

NSURLConnection的使用步驟

  • 創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑
  • 傳入NSURL創(chuàng)建一個(gè)NSURLRequest對(duì)象,設(shè)置請(qǐng)求頭和請(qǐng)求體
  • 使用NSURLConnection發(fā)送請(qǐng)求

NSURLConnection發(fā)送請(qǐng)求

  • NSURLConnection常見(jiàn)的發(fā)送請(qǐng)求方法有以下幾種

    • 同步請(qǐng)求 (該方法是阻塞式的,會(huì)卡住線程)

      + (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error
      
  • 異步請(qǐng)求:根據(jù)對(duì)服務(wù)器返回?cái)?shù)據(jù)的處理方式的不同,又可以分為2種

    • block回調(diào)

      + (void)sendAsynchronousRequest:(NSURLRequest*) request
                        queue:(NSOperationQueue*) queue
            completionHandler:(void (^)(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)) handler
      
    • Delegate

      // 1.0
      + (nullable NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate
      // 2.0
      - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediately
      // 3.0
      - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate
      
      • 在startImmediately = NO的情況下,需要調(diào)用start方法開(kāi)始發(fā)送請(qǐng)求

         - (void)start;
        
      • 需要遵守NSURLConnectionDataDelegate協(xié)議

NSURLConnectionDelegate

NSURLConnectionDataDelegate協(xié)議中的常用的代理方法

//1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//2.接收到服務(wù)器返回?cái)?shù)據(jù)的時(shí)候調(diào)用,(服務(wù)器返回的數(shù)據(jù)比較大時(shí)會(huì)調(diào)用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//3.當(dāng)請(qǐng)求失敗的時(shí)候調(diào)用(比如請(qǐng)求超時(shí))
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
//4.請(qǐng)求結(jié)束的時(shí)候調(diào)用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

NSMutableURLRequest

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

  • 設(shè)置請(qǐng)求超時(shí)等待時(shí)間(超過(guò)這個(gè)時(shí)間就算超時(shí),請(qǐng)求失敗)

    @property NSTimeInterval timeoutInterval;
    
  • 設(shè)置請(qǐng)求方法(比如GET和POST)

    @property (copy) NSString *HTTPMethod;
    
  • 設(shè)置請(qǐng)求體

    @property (nullable, copy) NSData *HTTPBody;
    
  • 設(shè)置請(qǐng)求頭

     //如果先前已經(jīng)為該頭字段賦了值,則該值將替換原來(lái)的值
     - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;
     /*
       設(shè)置改屬性后,會(huì)對(duì)原有的請(qǐng)求頭+該屬性,進(jìn)行數(shù)據(jù)合并,
       如果兩者頭字段有沖突,則保留后者(該屬性)頭字段的值
     */
    @property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields;  
     //如果先前為給定了頭字段,給定值附加到以前存在的值。適當(dāng)?shù)淖侄畏指舴ǘ禾?hào))
     - (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
    

創(chuàng)建GET和POST請(qǐng)求

GET請(qǐng)求
  • NSURLConnection同步請(qǐng)求

sendAsynchronousRequest方法

  1. 設(shè)置請(qǐng)求路徑
  2. 創(chuàng)建請(qǐng)求對(duì)象(默認(rèn)是GET請(qǐng)求,且已經(jīng)默認(rèn)包含了請(qǐng)求頭)
  3. 使用NSURLConnection `sendSynchronousRequest`方法發(fā)送網(wǎng)絡(luò)請(qǐng)求
  4. 該方法是阻塞式的方法,會(huì)卡住線程
  5. 接收到服務(wù)器的響應(yīng)后,解析響應(yīng)體
  • NSURLConnection異步請(qǐng)求(SendAsync)

sendAsynchronousRequest方法

  1. 設(shè)置請(qǐng)求路徑
  2. 創(chuàng)建請(qǐng)求對(duì)象(默認(rèn)是GET請(qǐng)求,且已經(jīng)默認(rèn)包含了請(qǐng)求頭)
  3. 使用NSURLConnection `sendAsynchronousRequest`方法發(fā)送網(wǎng)絡(luò)請(qǐng)求
  4. 該方法不會(huì)卡住當(dāng)前線程,網(wǎng)絡(luò)請(qǐng)求任務(wù)是異步執(zhí)行的
  5. 接收到服務(wù)器的響應(yīng)后,解析響應(yīng)體
  • NSURLConnection異步請(qǐng)求(代理)

delegate方法

  1. 確定請(qǐng)求路徑
  2. 創(chuàng)建請(qǐng)求對(duì)象
  3. 創(chuàng)建NSURLConnection對(duì)象并設(shè)置代理(3種方式)
  4. 遵守NSURLConnectionDataDelegate協(xié)議,并實(shí)現(xiàn)相應(yīng)的代理方法
  5. 在代理方法中監(jiān)聽(tīng)網(wǎng)絡(luò)請(qǐng)求的響應(yīng)

備注:代理方法默認(rèn)在主線程中調(diào)用的,想要修改調(diào)用線程,調(diào)用以下方法的方法:

 //1. 設(shè)置代理方法在哪個(gè)線程中調(diào)用
 - (void)setDelegateQueue:(nullable NSOperationQueue*) queue

//2. GCD + RunLoop配合使用
POST請(qǐng)求
POST的NSURLConnection請(qǐng)求方式與GET一樣(同步、異步、代理)
1. 確定URL路徑
2. 創(chuàng)建請(qǐng)求對(duì)象(可變對(duì)象)
3. 修改請(qǐng)求對(duì)象的方法為POST,設(shè)置請(qǐng)求體(Data)
4. 發(fā)送一個(gè)NSURLConnection請(qǐng)求
5. 補(bǔ)充:設(shè)置請(qǐng)求超時(shí),處理錯(cuò)誤信息,設(shè)置請(qǐng)求頭(如獲取客戶端的版本等信息,不設(shè)置就使用默認(rèn))

URL中文轉(zhuǎn)碼問(wèn)題

GET方式網(wǎng)絡(luò)請(qǐng)求時(shí),請(qǐng)求路徑中可能有中文,會(huì)導(dǎo)致NSURL對(duì)象為null,需要進(jìn)行中文轉(zhuǎn)碼操作

///中文轉(zhuǎn)碼操作
- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc

具體代碼查看Github項(xiàng)目

Github地址:iOSMultiTechnology
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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