swift開發網絡篇—利用NSURLSession 發送GET和POST請求


說明:本文示例代碼發送的請求均為http請求,需要對info.plist文件進行配置。如何配置,請參考https://github.com/HanGangAndHanMeimei/iOS9AdaptationTips

 

一、簡單說明

  在iOS9.0之后,以前使用的NSURLConnection過期,蘋果推薦使用NSURLSession來替換NSURLConnection完成網路請求相關操作。

  NSURLSession的使用非常簡單,先根據會話對象創建一個請求Task,然后執行該Task即可。

   NSURLSessionTask本身是一個抽象類,在使用的時候,通常是根據具體的需求使用它的幾個子類。關系如下:

  

 

二、發送GET請求

  使用NSURLSession發送GET請求的方法和NSURLConnection類似,整個過程如下:

    1)確定請求路徑(一般由公司的后台開發人員以接口文檔的方式提供),GET請求參數直接跟在URL后面

    2)創建請求對象(默認包含了請求頭和請求方法【GET】),此步驟可以省略

    3)創建會話對象(NSURLSession)

    4)根據會話對象創建請求任務(NSURLSessionDataTask)

    5)執行Task

    6)當得到服務器返回的響應后,解析數據(XML|JSON|HTTP)

示例代碼:

發生GET請求第一種方法

 

func GET1()

    {

        

        //對請求路徑的說明

        //http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON

        //協議頭+主機地址+接口名稱++參數1&參數2&參數3

        //協議頭(http://)+主機地址(120.25.226.186:32812)+接口名稱(login)++參數1(username=520it)&參數2(pwd=520)&參數3(type=JSON)

        //GET請求,直接把請求參數跟在URL的后面以?隔開,多個參數之間以&符號拼接

    

        //1.確定請求路徑

    

        var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

    

        //2.創建請求對象

        //請求對象內部默認已經包含了請求頭和請求方法(GET

        var request: NSURLRequest = NSURLRequest(URL: url)

    

        //3.獲得會話對象

        var session: NSURLSession = NSURLSession.sharedSession()

    

        //4.根據會話對象創建一個Task(發送請求)

        /*

        第一個參數:請求對象

        第二個參數:completionHandler回調(請求完成【成功|失敗】的回調)

                     data:響應體信息(期望的數據)

                     response:響應頭信息,主要是對服務器端的描述

                     error:錯誤信息,如果請求失敗,則error有值

        */

        var dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) in

            

            if(error == nil){

                //6.解析服務器返回的數據

                //說明:(此處返回的數據是JSON格式的,因此使用NSJSONSerialization進行反序列化處理)

                var dict:NSDictionary? = nil

                do {

                    dict  = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.init(rawValue: 0)) as! NSDictionary

                } catch {

                    

                }

                print("%@",dict)

            }

        }

         //5.執行任務

         dataTask.resume()

     }


 

發生GET請求第二種方法

    func GET2()

 

    {

        

        //1.確定請求路徑

        var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

    

        //2.獲得會話對象

        var session: NSURLSession = NSURLSession.sharedSession()

    

        //3.根據會話對象創建一個Task(發送請求)

        /*

        第一個參數:請求路徑

        第二個參數:completionHandler回調(請求完成【成功|失敗】的回調)

                  data:響應體信息(期望的數據)

                  response:響應頭信息,主要是對服務器端的描述

                  error:錯誤信息,如果請求失敗,則error有值

            注意:

            1)該方法內部會自動將請求路徑包裝成一個請求對象,該請求對象默認包含了請求頭信息和請求方法(GET

            2)如果要發送的是POST請求,則不能使用該方法

        */

        var dataTask: NSURLSessionDataTask = session.dataTaskWithURL(url) { (data, response, error) in

            //5.解析數據

            var dict:NSDictionary? = nil

            do {

                dict  = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.init(rawValue: 0)) as! NSDictionary

            } catch {

                

            }

            

            print("%@",dict)

        }

        

         //4.執行任務

        dataTask.resume()

    }


 

 執行結果:

  

  此處打印的值是一個字典,字典中success這個key對應的value打印出來為Unicode編碼的,如果想輸出中文,可以為NSDictionary提供一個分類,重寫系統中的方法。

  

    //字典分類中重寫系統的方法

    func descriptionWithLocale(locale: AnyObject,level: NSInteger) ->NSString

    {

        //初始化可變字符串

        var string: NSMutableString = NSMutableString()

        //拼接開頭[

        string += "["

        [string appendString:@"["];

    

        //拼接字典中所有的鍵值對

        [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

                    [string appendFormat:@"%@:",key];

                    [string appendFormat:@"%@",obj];

                 }];

        

             //拼接結尾]

            [string appendString:@"]"];

        

             return string

    }

 


 

三、發送POST請求

  使用NSURLSession發送POST請求的方法和NSURLConnection類似,整個過程如下:

    1)確定請求路徑(一般由公司的后台開發人員以接口文檔的方式提供)

    2)創建可變的請求對象(因為需要修改),此步驟不可以省略

    3)修改請求方法為POST

    4)設置請求體,把參數轉換為二進制數據並設置請求體

    5)創建會話對象(NSURLSession)

    6)根據會話對象創建請求任務(NSURLSessionDataTask)

    7)執行Task

    8)當得到服務器返回的響應后,解析數據(XML|JSON|HTTP)

  示例代碼:

    //發送POST請求NSURLSession

    func POST()

    {

        //對請求路徑的說明

        //http://120.25.226.186:32812/login

        //協議頭+主機地址+接口名稱

        //協議頭(http://)+主機地址(120.25.226.186:32812)+接口名稱(login)

        //POST請求需要修改請求方法為POST,並把參數轉換為二進制數據設置為請求體

        

        //1.創建會話對象

        var session: NSURLSession = NSURLSession.sharedSession()

        

        //2.根據會話對象創建task

        var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login")!

        

        //3.創建可變的請求對象

        var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)

        

        //4.修改請求方法為POST

        request.HTTPMethod = "POST"

        

        //5.設置請求體

        request.HTTPBody = "username=520it&pwd=520it&type=JSON".dataUsingEncoding(NSUTF8StringEncoding)

        

        //6.根據會話對象創建一個Task(發送請求)

        /*

         第一個參數:請求對象

         第二個參數:completionHandler回調(請求完成【成功|失敗】的回調)

         data:響應體信息(期望的數據)

         response:響應頭信息,主要是對服務器端的描述

         error:錯誤信息,如果請求失敗,則error有值

         */

        var dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) in

            

            //if(error == nil){

                //8.解析數據

                //說明:(此處返回的數據是JSON格式的,因此使用NSJSONSerialization進行反序列化處理)

                var dict:NSDictionary? = nil

                do {

                    dict  = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.init(rawValue: 0)) as! NSDictionary

                } catch {

                    

                }

                print("%@",dict)

            //}

        }

        //5.執行任務

        dataTask.resume()

    }

 


 

四、NSURLSession代理方法簡單介紹

有的時候,我們可能需要監聽網絡請求的過程(如下載文件需監聽文件下載進度),那么就需要用到代理方法。接下來通過代碼簡單說明NSURLSession中普通網絡請求會涉及代理方法的使用

private var _responseData: NSMutableData!

    var responseData: NSMutableData!{

        get{

            if _responseData == nil {

                _responseData = NSMutableData()

            }

            return _responseData

        }

        set{

            self._responseData = newValue

        }

    }

    

    //當點擊控制器View的時候會調用該方法

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)

    {

        self.delegateTest()

    }

    

    //發送請求,代理方法

    func delegateTest()

    {

        //1.確定請求路徑

        var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

        

        //2.創建請求對象

        //請求對象內部默認已經包含了請求頭和請求方法(GET

        var request: NSURLRequest = NSURLRequest(URL: url)

        

        //3.獲得會話對象,並設置代理

             /*

               第一個參數:會話對象的配置信息defaultSessionConfiguration 表示默認配置

               第二個參數:誰成為代理,此處為控制器本身即self

               第三個參數:隊列,該隊列決定代理方法在哪個線程中調用,可以傳主隊列|非主隊列

               [NSOperationQueue mainQueue]   主隊列:   代理方法在主線程中調用

               [[NSOperationQueue alloc]init] 非主隊列: 代理方法在子線程中調用

             */

        var session: NSURLSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue())

        

        //4.根據會話對象創建一個Task(發送請求)

        var dataTask: NSURLSessionTask = session.dataTaskWithRequest(request)

        

        //5.執行任務

        dataTask.resume()

    }

    

    //1.接收到服務器響應的時候調用該方法

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {

        

        //在該方法中可以得到響應頭信息,即response

             print("didReceiveResponse--%@",NSThread.currentThread)

        

             //注意:需要使用completionHandler回調告訴系統應該如何處理服務器返回的數據

             //默認是取消的

             /*

                  NSURLSessionResponseCancel = 0,        默認的處理方式,取消

                  NSURLSessionResponseAllow = 1,         接收服務器返回的數據

                  NSURLSessionResponseBecomeDownload = 2,變成一個下載請求

                  NSURLSessionResponseBecomeStream        變成一個流

               */

        completionHandler(NSURLSessionResponseDisposition.Allow)

    }

    

    

    //2.接收到服務器返回數據的時候會調用該方法,如果數據較大那么該方法可能會調用多次

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {

        

        print("didReceiveData--%@",NSThread.currentThread)

        

        //拼接服務器返回的數據

        self.responseData.appendData(data)

    }


    

    //3.當請求完成(成功|失敗)的時候會調用該方法,如果請求失敗,則error有值

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {

        print("didCompleteWithError--%@",NSThread.currentThread)

        

        if (error == nil) {

            //解析數據,JSON解析請參考http://www.cnblogs.com/wendingding/p/3815303.html

            var dict:NSDictionary? = nil

            do {

                dict  = try NSJSONSerialization.JSONObjectWithData(self.responseData, options: NSJSONReadingOptions.init(rawValue: 0)) as! NSDictionary

            } catch {

                

            }

            

            print("%@",dict)

        }

    }


  代碼執行結果:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM