天天看點

iOS - ASIHTTPRequest 網絡請求前言1、ASIHTTPRequest2、ASIHTTPRequest 的使用3、ASI 同步 GET 請求4、ASI 異步 GET 請求5、ASI POST 請求

使用 iOS SDK 中的 HTTP 網絡請求 API,相當的複雜,調用很繁瑣,ASIHTTPRequest 就是一個對 CFNetwork API 進行了封裝,并且使用起來非常簡單的一套 API,外号 “HTTP終結者”,用 Objective-C 編寫,運作效率很高,可以很好的應用在 Mac OS X 系統和 iOS 平台的應用程式中,ASIHTTPRequest 适用于基本的 HTTP 請求,和基于 REST 的服務之間的互動。可惜作者早已停止更新,有一些潛在的 BUG 無人去解決,很多公司的舊項目裡面都殘留着它的身影,以前的很多 iOS 項目都是 ASI + SBJson,會不會用 ASI,可以算是檢驗是否為老牌 iOS 程式員的标準之一。從 iOS 9 開始 CFNetwork 相關的類和方法開始被廢棄,可以使用 AFNetworking 替換 ASIHTTPRequest 的使用。在 iOS 9+ 中使用 ASIHTTPRequest 無需對 App Transport Security Settings 添加設定。

通過簡單的接口,即可完成向服務端送出資料和從服務端擷取資料的工作。

下載下傳的資料,可存儲到記憶體中或直接存儲到磁盤中。

能上傳本地檔案到服務端。

可以友善的通路和操作請求和傳回的 Http 頭資訊。

可以擷取到上傳或下載下傳的進度資訊,為應用程式提供更好的體驗。

支援上傳或下載下傳隊列,并且可擷取隊列的進度資訊。

支援基本、摘要和 NTLM 身份認證,在同一會話中授權憑證會自動維持,并且可以存儲在 Keychain(Mac 和 iOS 作業系統的密碼管理系統)中。

支援 Cookie。

當應用(iOS 4+)在背景運作時,請求可以繼續運作。

支援 GZIP 壓縮資料。

内置的 ASIDownloadCache 類,可以緩存請求傳回的資料,這樣即使沒有網絡也可以傳回已經緩存的資料結果。

ASIWebPageRequest 可以下載下傳完整的網頁,包括包含的網頁、樣式表、腳本等資源檔案,并顯示在 UIWebView /WebView 中。任意大小的頁面都可以無限期緩存,這樣即使沒有網絡也可以離線浏覽。

支援用戶端證書。

支援通過代理發起 Http 請求。

支援帶寬限制。在 iOS 平台,可以根據目前網絡情況來自動決定是否限制帶寬,例如當使用 WWAN(GPRS/Edge/3G) 網絡時限制,而當使用 WIFI 時不做任何限制。

支援斷點續傳。

支援同步和異步請求。

1、底層實作

1)AFN 的底層實作基于 OC 的 NSURLConnection 和 NSURLSession

2)ASI 的底層實作基于純 C 語言的 CFNetwork 架構

3)因為 NSURLConnection 和 NSURLSession 是在 CFNetwork 之上的一層封裝,是以 ASI 的運作性能高于 AFN

2、對伺服器傳回的資料處理

1)ASI 沒有直接提供對伺服器資料處理的方式,直接傳回的是 NSData/NSString

2)AFN 提供了多種對伺服器資料處理的方式

(1) JSON 處理-直接傳回 NSDictionary 或者 NSArray

(2) XML 處理-傳回的是 xml 類型資料,需對其進行解析

(3) 其他類型資料處理

3、監聽請求過程

1)AFN 提供了success 和 failure 兩個 block 來監聽請求的過程(隻能監聽成功和失敗)

success : 請求成功後調用

failure : 請求失敗後調用

2)ASI 提供了 3 套方案,每一套方案都能監聽請求的完整過程(監聽請求開始、接收到響應頭資訊、接受到具體資料、接受完畢、請求失敗)

成為代理,遵守協定,實作協定中的代理方法

成為代理,不遵守協定,自定義代理方法

設定 block

4、在檔案下載下傳和檔案上傳的使用難易度

1)AFN

不容易實作監聽下載下傳進度和上傳進度

不容易實作斷點續傳

一般隻用來下載下傳不大的檔案

2)ASI

非常容易實作下載下傳和上傳

非常容易監聽下載下傳進度和上傳進度

非常容易實作斷點續傳

下載下傳大檔案或小檔案均可

3)實作下載下傳上傳推薦使用 ASI

5、網絡監控

1)AFN 自己封裝了網絡監控類,易使用

2)ASI 使用的是 Reachability,因為使用 CocoaPods 下載下傳 ASI 時,會同步下載下傳 Reachability,但 Reachability 作為網絡監控使用較為複雜(相對于 AFN 的網絡監控類來說)

3)推薦使用 AFN 做網絡監控 AFNetworkReachabilityManager

6、ASI 提供的其他實用功能

1)控制信号旁邊的圈圈要不要在請求過程中轉

2)可以輕松地設定請求之間的依賴:每一個請求都是一個 NSOperation 對象

3)可以統一管理所有請求(還專門提供了一個叫做 ASINetworkQueue 來管理所有的請求對象)

暫停/恢複/取消所有的請求

監聽整個隊列中所有請求的下載下傳進度和上傳進度

Github 網址:

<a href="https://github.com/pokeb/asi-http-request">https://github.com/pokeb/asi-http-request</a>

<a href="https://allseeing-i.com/ASIHTTPRequest/">https://allseeing-i.com/ASIHTTPRequest/</a>

ASIHTTPRequest 系統需求:

ASIHTTPRequest Version

Minimum iOS Target

Target Notes

1.8.1 -&gt; 1.8.2

iOS 3.0+

0.2 -&gt; 1.8.0

ASIHTTPRequest 使用 MRC

Objective-C

這是 ASIHTTPRequest 最簡單的一種使用模式,發送 startSynchronous 消息後即開始在同一線程中執行 HTTP 請求,線程将一直等待直到請求結束(請求成功或者失敗)。通過檢查 error 屬性可以判斷請求是否成功或者有錯誤發生。

要擷取傳回的文本資訊,調用 responseString 方法。如果下載下傳的是二進制檔案,例如圖檔、MP3,則調用 responseData 方法,可以得到一個 NSData 對象。

一般情況下,應該優先使用異步請求代替同步請求,當在主線程中使用 ASIHTTPRequest 同步請求會阻塞主線程的執行,這導緻使用者界面不響應使用者操作,任何動畫都會停止渲染,直到請求完成。

資料請求

檔案下載下傳

通過設定 request 的 setDownloadDestinationPath,可以設定下載下傳檔案用的下載下傳目标目錄。首先,下載下傳過程檔案會儲存在 temporaryFileDownloadPath 目錄下。如果下載下傳完成會做以下事情:

1,如果資料是壓縮的,進行解壓,并把檔案放在 downloadDestinationPath 目錄中,臨時檔案被删除。

2,如果下載下傳失敗,臨時檔案被直接移到 downloadDestinationPath 目錄,并替換同名檔案。

如果你想擷取下載下傳中的所有資料,可以實作 delegate 中的 request:didReceiveData:方法。但如果你實作了這個方法,request 在下載下傳完後,request 并不把檔案放在 downloadDestinationPath中,需要手工處理。

請求在背景線程中運作,當請求執行完後再通知調用的線程。這樣不會導緻主線程進行網絡請求時,界面被鎖定等情況。

協定方式

在這裡實作了兩個 delegate 的方法,當資料請求成功時會調用 requestFinished,請求失敗時(如網絡問題或伺服器内部錯誤)會調用 requestFailed。

Block 方式

在平台支援情況下,ASIHTTPRequest 1.8 以上支援 block。

POST 表單

ASIFormDataRequest,模拟 Form 表單送出,其送出格式與 Header 會自動識别。檔案中的資料是需要時才從磁盤加載,是以隻要 web server 能處理,那麼上傳大檔案是沒有問題的。

PUT 請求、自定義 POST 請求

如果你想發送 PUT 請求,或者你想自定義 POST 請求,使用 appendPostData: 或者 appendPostDataFromFile:

繼續閱讀