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

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

    1.HTTP協議之POST與GET

    訪問網絡數據大部分都要用到HTTP協議,經過HTTP協議向服務器請求數據,再經過HTTP協議得到服務器的響應數據,常見的操做主要是POST與GET,這兩個操做能夠知足絕大部分的應用需求了。git

    GET操做主要使用場景是請求網絡資源,例如在瀏覽器中訪問網頁就發起了不少GET請求,GET請求的缺點在於安全性不夠,參數都在URL中了,而且不一樣的瀏覽器對URL長度有不一樣長度的限制,一些複雜的請求就不適用了。這時候須要用POST請求,POST請求的全部參數都放在請求體中,安全性更好,而且理論上沒有數據量的限制,文件上傳、帳號登錄等都用POST請求。 通常GET請求只適合於簡單的查詢請求,增刪改通常都用POST請求。github

    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連接下載數據」session

    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提供的方法:

 

相關文章
相關標籤/搜索