iOS開發筆記4:HTTP網絡通信及網絡編程


    這一篇主要總結iOS開發中進行HTTP通信及數據上傳下載用到的方法。網絡編程中常用的有第三方類庫AFNetworking或者iOS7開始新推出的NSURLSession,還有NSURLSession的前任NSURLConnection。一般情況下,使用AFNetworking即可滿足絕大多數要求,並且更簡潔高效。

    1.HTTP協議之POST與GET

    訪問網絡數據大部分都要用到HTTP協議,通過HTTP協議向服務器請求數據,再通過HTTP協議獲得服務器的響應數據,常見的操作主要是POST與GET,這兩個操作可以滿足絕大部分的應用需求了。

    GET操作主要使用場景是請求網絡資源,例如在瀏覽器中訪問網頁就發起了很多GET請求,GET請求的缺點在於安全性不夠,參數都在URL中了,並且不同的瀏覽器對URL長度有不同長度的限制,一些復雜的請求就不適用了。這時候需要用POST請求,POST請求的所有參數都放在請求體中,安全性更好,並且理論上沒有數據量的限制,文件上傳、賬號登陸等都用POST請求。 一般GET請求只適合於簡單的查詢請求,增刪改一般都用POST請求。

    2.HTTP請求中的一些參數

    (1)請求行,包含請求方法、請求路徑、HTTP協議版本信息

   

   (2)請求頭,包含訪問的服務器主機地址Host、緩存控制指令Cache-Control、客戶端類型User-Agent、客戶接收數據類型Accept、客戶端語言環境Accept-Language以及客戶端支持的數據壓縮格式Accept-Encoding等等

    (3)如果是POST請求,還有請求體信息

    3.HTTP響應中的一些參數

   (1)狀態行,包含了HTTP協議版本、狀態碼、狀態英文名稱

    (2)響應頭,包含服務器類型Server、返回數據類型Content-Type、返回數據長度Content-Length等等

    (3)實體內容,即服務器根據客戶端的請求返回的數據

    4.dataWithContentsOfURL

     這是最簡單的網絡請求,直接指定URL即可使用,但是請求的數據會放在手機內存當中,當下載的數據量較大時是不合理,並且不適用於HTTPS請求,參見之前博客“斯坦福iOS7公開課11筆記及演示Demo&訪問HTTPS鏈接下載數據”

    5.NSURLConnection

    發起請求有多種方式,也可以設置好請求參數,暫時不發出請求,在某一個地方再觸發請求,如圖所示

    這里我們選用“- connectWithRequest:delegate:”發起一個異步請求,並設置好代理,方便后續代理事件中對響應事件進行處理

    在代理方法中對數據進行處理,下載的數據名稱從響應信息里獲取“response.suggestedFilename”,與服務器端保持一致,需要注意的是,這里是在cache文件夾創建了一個文件,然后不斷寫入接收到數據,而不是使用NSMutableData,這是因為使用NSMutableData,接收到數據會存放在內存中,如果數據量較大會嚴重影響性能。所以一般不使用NSMutableData這種方式。

      更復雜的情況還有斷點續傳,對此,首先我們可以從服務器響應信息中獲取數據的總長度response.expectedContentLength,並在每次接收數據時更新已接受數據的長度值,將二者的數據存儲到沙盒中,中斷后重新下載時,根據當前已下載數據的長度值,設置HTTP請求頭的中“Range”,按照目前進度繼續下載即可。

    6.NSURLSession 

      NSURLSession是iOS7開始新推出的網絡基礎架構,用來代替NSURLConnection,主要有三個重要的子類:NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask,分別用來獲取數據、上傳文件以及下載文件。並且使用NSURLSession還可以在后台執行上傳下載任務,以及NSURLSessionConfiguration的眾多設置選項,對於iOS網絡編程來說完全足以替代甚至超越NSURLConnection。

     (1)NSURLSessionDataTask

      根據URL,使用dataTask獲取數據

 

   對於POST請求,還可以構造一個NSMutableURLRequest,對請求體進行設置,調用session的“dataTaskWithRequest”方法即可。

 (2)NSURLSessionDownloadTask

   需要注意的是下載文件默認是存放到臨時文件夾temp里的,下載完成后需要將其移動到目標位置。

   執行下載任務可以直接發起請求下載:

 

   也可以在delegate事件中進行處理:

 

     NSURLSession實現斷點下載更為容易,主要是通過“cancelByProducingResumeData”方法的回調事件拿到"resumeData",恢復下載時根據"resumeData"繼續下載“

downloadTaskWithResumeData”即可。

  (3)NSURLSessionUploadTask

    使用NSURLSessionUploadTask來執行上傳任務更為簡便,不像NSURLConnection還需要在請求體設置許多參數,一個 request加上要上傳的 NSData 對象或者是本地文件路徑對應的 NSURL即可。

    7.AFNetworking

   iOS開發中可能更常用的AFNetWorking,使得網絡編程更簡潔使用。

   下載地址:https://github.com/AFNetworking/AFNetworking

   下圖為常見的兩個使用示例:

    需要注意的是:

   (1)AFNetworking默認是把返回數據當做JSON來解析的,如果返回數據是XML或者要求對響應數據不進行解析操作,直接返回NSData,需要分別設置解析類型為“AFXMLParserResponseSerializer”、“AFHTTPResponseSerializer”。

    (2)實際情況中,返回數據的Content-Type可能不在AFNetworking支持的類型中,需要在“AFURLResponseSerialization.m”中添加對應類型

 

    同時AFNetworking對NSURLSession也進行了封裝,所以NSURLSession能做的事情,AFNetworking也能做,並且寫法更為簡便。

    8.網絡狀態監控

    監控網絡狀態有兩種辦法

  (1)使用蘋果提供的“Reachability”(非arc,需要注意設置編譯參數):

  (2)使用AFNetworking提供的方法:

 


免責聲明!

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



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