NSURLConnection使用

NSURLConnection的使用

  • NSURL:請求地址
  • NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有;
    • 一個NSURL對象
    • 請求方法、請求頭、請求體
    • 請求超時
    • ...
  • NSMutableURLRequest:NSURLRequest的子類
  • NSURLConnection
    • 負責發送請求,建立客戶端和服務器的連接
    • 發送數據給服務器,并收集來自服務器的響應數據

NSURLConnection的使用步驟

  • 創建一個NSURL對象,設置請求路徑
  • 傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體
  • 使用NSURLConnection發送請求

NSURLConnection發送請求

  • NSURLConnection常見的發送請求方法有以下幾種

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

      + (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error
      
  • 異步請求:根據對服務器返回數據的處理方式的不同,又可以分為2種

    • block回調

      + (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的情況下,需要調用start方法開始發送請求

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

NSURLConnectionDelegate

NSURLConnectionDataDelegate協議中的常用的代理方法

//1.當接收到服務器響應的時候調用
- (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;

NSMutableURLRequest

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

  • 設置請求超時等待時間(超過這個時間就算超時,請求失敗)

    @property NSTimeInterval timeoutInterval;
    
  • 設置請求方法(比如GET和POST)

    @property (copy) NSString *HTTPMethod;
    
  • 設置請求體

    @property (nullable, copy) NSData *HTTPBody;
    
  • 設置請求頭

     //如果先前已經為該頭字段賦了值,則該值將替換原來的值
     - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;
     /*
       設置改屬性后,會對原有的請求頭+該屬性,進行數據合并,
       如果兩者頭字段有沖突,則保留后者(該屬性)頭字段的值
     */
    @property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields;  
     //如果先前為給定了頭字段,給定值附加到以前存在的值。適當的字段分隔符(逗號)
     - (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
    

創建GET和POST請求

GET請求
  • NSURLConnection同步請求

sendAsynchronousRequest方法

  1. 設置請求路徑
  2. 創建請求對象(默認是GET請求,且已經默認包含了請求頭)
  3. 使用NSURLConnection `sendSynchronousRequest`方法發送網絡請求
  4. 該方法是阻塞式的方法,會卡住線程
  5. 接收到服務器的響應后,解析響應體
  • NSURLConnection異步請求(SendAsync)

sendAsynchronousRequest方法

  1. 設置請求路徑
  2. 創建請求對象(默認是GET請求,且已經默認包含了請求頭)
  3. 使用NSURLConnection `sendAsynchronousRequest`方法發送網絡請求
  4. 該方法不會卡住當前線程,網絡請求任務是異步執行的
  5. 接收到服務器的響應后,解析響應體
  • NSURLConnection異步請求(代理)

delegate方法

  1. 確定請求路徑
  2. 創建請求對象
  3. 創建NSURLConnection對象并設置代理(3種方式)
  4. 遵守NSURLConnectionDataDelegate協議,并實現相應的代理方法
  5. 在代理方法中監聽網絡請求的響應

備注:代理方法默認在主線程中調用的,想要修改調用線程,調用以下方法的方法:

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

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

URL中文轉碼問題

GET方式網絡請求時,請求路徑中可能有中文,會導致NSURL對象為null,需要進行中文轉碼操作

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

具體代碼查看Github項目

Github地址:iOSMultiTechnology
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容