亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS - ASIHTTPRequest 網絡請求

2020-07-26 03:00:26
字體:
來源:轉載
供稿:網友

前言

使用 iOS SDK 中的 HTTP 網絡請求 API,相當的復雜,調用很繁瑣,ASIHTTPRequest 就是一個對 CFNetwork API 進行了封裝,并且使用起來非常簡單的一套 API,外號 “HTTP終結者”,用 Objective-C 編寫,運行效率很高,可以很好的應用在 Mac OS X 系統和 iOS 平臺的應用程序中,ASIHTTPRequest 適用于基本的 HTTP 請求,和基于 REST 的服務之間的交互??上ё髡咴缫淹V垢拢幸恍撛诘?BUG 無人去解決,很多公司的舊項目里面都殘留著它的身影,以前的很多 iOS 項目都是 ASI + SBJson,會不會用 ASI,可以算是檢驗是否為老牌 iOS 程序員的標準之一。從 iOS 9 開始 CFNetwork 相關的類和方法開始被廢棄,可以使用 AFNetworking 替換 ASIHTTPRequest 的使用。在 iOS 9+ 中使用 ASIHTTPRequest 無需對 App Transport Security Settings 添加設置。

1、ASIHTTPRequest

1.1 ASI 主要特色

  • 通過簡單的接口,即可完成向服務端提交數據和從服務端獲取數據的工作。
  • 下載的數據,可存儲到內存中或直接存儲到磁盤中。
  • 能上傳本地文件到服務端。
  • 可以方便的訪問和操作請求和返回的 Http 頭信息。
  • 可以獲取到上傳或下載的進度信息,為應用程序提供更好的體驗。
  • 支持上傳或下載隊列,并且可獲取隊列的進度信息。
  • 支持基本、摘要和 NTLM 身份認證,在同一會話中授權憑證會自動維持,并且可以存儲在 Keychain(Mac 和 iOS 操作系統的密碼管理系統)中。
  • 支持 Cookie。
  • 當應用(iOS 4+)在后臺運行時,請求可以繼續運行。
  • 支持 GZIP 壓縮數據。
  • 內置的 ASIDownloadCache 類,可以緩存請求返回的數據,這樣即使沒有網絡也可以返回已經緩存的數據結果。
  • ASIWebPageRequest 可以下載完整的網頁,包括包含的網頁、樣式表、腳本等資源文件,并顯示在 UIWebView /WebView 中。任意大小的頁面都可以無限期緩存,這樣即使沒有網絡也可以離線瀏覽。
  • 支持客戶端證書。
  • 支持通過代理發起 Http 請求。
  • 支持帶寬限制。在 iOS 平臺,可以根據當前網絡情況來自動決定是否限制帶寬,例如當使用 WWAN(GPRS/Edge/3G) 網絡時限制,而當使用 WIFI 時不做任何限制。
  • 支持斷點續傳。
  • 支持同步和異步請求。

1.2 AFN 與 ASI 的區別

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 來監聽請求的過程(只能監聽成功和失?。?/p>

  •  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 來管理所有的請求對象) 暫停/恢復/取消所有的請求
監聽整個隊列中所有請求的下載進度和上傳進度

2、ASIHTTPRequest 的使用

2.1 添加 ASIHTTPRequest

Github 網址: https://github.com/pokeb/asi-http-request

https://allseeing-i.com/ASIHTTPRequest/

ASIHTTPRequest 系統需求:

ASIHTTPRequest Version Minimum iOS Target Target Notes
1.8.1 -> 1.8.2 iOS 3.0+
0.2 -> 1.8.0

ASIHTTPRequest 使用 MRC

Objective-C

  // 添加系統庫文件  CFNetwork.framework  SystemConfiguration.framework  MobileCoreServices.framework  CoreGraphics.framework  libz.1.1.3.tbd  libxml2.2.tbd  // 添加第三方庫文件  ASIHTTPRequest-1.8.2  // 在 TARGETS -> Builed Settings -> Search Paths -> Header Search Paths 中添加文件路徑  /usr/include/libxml2  // 在 TARGETS -> Build Phases -> Compile Sources -> ...in .../ASIHTTPRequest 后添加  -fno-objc-arc  // 包含頭文件  #import "ASIHTTPRequest.h"  #import "ASIFormDataRequest.h"

2.2 ASIHTTPRequest 的設置

Objective-C

  // 設置請求頭  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]];  [request addRequestHeader:@"Referer" value:@"http://www.dreamingwish.com/"];  // 設置應用后臺運行時是否仍然請求數據  request.shouldContinueWhenAppEntersBackground = YES;  // 設置請求超時時重試的次數  request.numberOfTimesToRetryOnTimeout = 3;  // 設置 KeepAlive 支持    // Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes    request.persistentConnectionTimeoutSeconds = 120;    // Disable persistent connections entirely    request.shouldAttemptPersistentConnection = NO;  // 設置是否顯示網絡請求信息在 status bar 上  [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO];  // 網絡狀態檢查  BOOL isNetworkInUse = [ASIHTTPRequest isNetworkInUse];

3、ASI 同步 GET 請求

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

要獲取返回的文本信息,調用 responseString 方法。如果下載的是二進制文件,例如圖片、MP3,則調用 responseData 方法,可以得到一個 NSData 對象。

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

Objective-C

數據請求

  NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];  // 創建請求  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  // 設置超時時間,可不設置,使用默認  request.timeOutSeconds = 5;  // 發送同步請求  [request startSynchronous];  // 獲得錯誤信息  NSError *error = [request error];  // 網絡請求失敗  if (error) {    // 網絡請求成功    NSLog(@"網絡請求失敗:/n%@", error);  } else {    // 獲得服務器的響應,字符串格式    NSString *responseString = [request responseString];    NSLog(@"網絡請求成功:/n%@", responseString);    // 獲得服務器的響應,NSData 格式    NSData *responseData = [request responseData];    textView.text = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];  }

文件下載

通過設置 request 的 setDownloadDestinationPath,可以設置下載文件用的下載目標目錄。首先,下載過程文件會保存在 temporaryFileDownloadPath 目錄下。如果下載完成會做以下事情:

1,如果數據是壓縮的,進行解壓,并把文件放在 downloadDestinationPath 目錄中,臨時文件被刪除。

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

如果你想獲取下載中的所有數據,可以實現 delegate 中的 request:didReceiveData:方法。但如果你實現了這個方法,request 在下載完后,request 并不把文件放在 downloadDestinationPath中,需要手工處理。

  NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/wp-content/uploads/2011/10/asihttprequest-auth.png"];  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  // 設置文件存儲路徑  [request setDownloadDestinationPath:@"/Users/JHQ0228/Desktop/asi.png"];  [request startSynchronous];  // 獲得錯誤信息  NSError *error = [request error];  // 網絡請求失敗  if (error) {    NSLog(@"網絡請求失敗:/n%@", error);  } else {    // 網絡請求成功    NSLog(@"網絡請求成功:/n");  }

4、ASI 異步 GET 請求

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

1、協議方式

在這里實現了兩個 delegate 的方法,當數據請求成功時會調用 requestFinished,請求失敗時(如網絡問題或服務器內部錯誤)會調用 requestFailed。

  NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];  // 創建請求  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  // 設置超時時間,可不設置,使用默認  request.timeOutSeconds = 5;  // 設置代理,需遵守 <ASIHTTPRequestDelegate> 協議  request.delegate = self;  // 發送異步請求  [request startAsynchronous];  // 網絡請求成功,協議方法  - (void)requestFinished:(ASIHTTPRequest *)request {  }  // 網絡請求失敗,協議方法  - (void)requestFailed:(ASIHTTPRequest *)request {  }

2、Block 方式

在平臺支持情況下,ASIHTTPRequest 1.8 以上支持 block。

  NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];  // 創建請求,加 __weak 除去 block 循環調用警告  __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  // 設置超時時間,可不設置,使用默認  request.timeOutSeconds = 5;  // 發送異步請求  [request startAsynchronous];  // 網絡請求成功  [request setCompletionBlock:^{  }];  // 網絡請求失敗  [request setFailedBlock:^{  }];

5、ASI POST 請求

1、POST 表單

ASIFormDataRequest,模擬 Form 表單提交,其提交格式與 Header 會自動識別。文件中的數據是需要時才從磁盤加載,所以只要 web server 能處理,那么上傳大文件是沒有問題的。

  // 通常數據是以 'application/x-www-form-urlencoded' 格式發送的,如果上傳了二進制數據或者文件,那么格式將自動變為 ‘multipart/form-data'。    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];    // 沒有文件    [request setPostValue:@"Ben" forKey:@"first_name"];    [request setPostValue:@"Copsey" forKey:@"last_name"];    // 發送文件    [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];  // 數據的 mime 頭是自動判定的,但是如果你想自定義mime頭,那么這樣:    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];    // Upload a file on disk    [request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];     // Upload an NSData instance    NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"myphoto.jpg"]);    [request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];  // 你可以使用 addPostValue 方法來發送相同 name 的多個數據:    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];    [request addPostValue:@"Ben" forKey:@"names"];    [request addPostValue:@"George" forKey:@"names"];

2、PUT 請求、自定義 POST 請求

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

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];  [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];  // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:  [request setRequestMethod:@"PUT"];

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线网站| 日韩在线观看免费av| 欧美日韩精品在线观看| 久久噜噜噜精品国产亚洲综合| 成人看片人aa| 国产精品久久久久不卡| 精品国产区一区二区三区在线观看| 国产成人精品一区二区| 欧美综合在线第二页| 午夜精品www| 97视频在线观看网址| 欧美成人激情视频免费观看| 精品久久中文字幕久久av| 久久成人精品电影| 欧美成人午夜激情在线| 97人人做人人爱| 国产精品免费久久久| 国产精品视频一区国模私拍| 日本aⅴ大伊香蕉精品视频| 久久黄色av网站| 亚洲a级在线播放观看| 91黑丝在线观看| 亚洲在线观看视频网站| 欧美激情视频一区二区三区不卡| 欧美日韩福利电影| 国产日韩欧美夫妻视频在线观看| 成人中文字幕在线观看| 欧美国产视频一区二区| 亚洲在线视频福利| 国产精品旅馆在线| 国产在线不卡精品| 日韩成人高清在线| 亚洲а∨天堂久久精品喷水| 91久久国产精品91久久性色| 亚洲国产精品福利| 国产精品视频一区国模私拍| 国产成人午夜视频网址| 久久精品视频免费播放| 久久国产精品99国产精| 亚洲精品wwww| 国产精品美女免费视频| 都市激情亚洲色图| 另类少妇人与禽zozz0性伦| 日韩经典一区二区三区| 亚洲大胆人体av| 日韩精品久久久久久福利| 亚洲欧美日韩久久久久久| 国产一区二区视频在线观看| 欧美成人一区二区三区电影| 国产精品久久久久久久久久小说| 国产一区二区欧美日韩| 在线观看91久久久久久| 亚洲国产欧美一区二区丝袜黑人| 97视频色精品| 庆余年2免费日韩剧观看大牛| 日韩欧美精品中文字幕| 欧美大片欧美激情性色a∨久久| 色综合老司机第九色激情| 国产欧美va欧美va香蕉在| 亚洲自拍欧美另类| 国产一区视频在线播放| 亚洲精品美女在线| 国产精品久久久久av| 亚洲一区二区三区成人在线视频精品| 这里只有精品在线观看| 久久大大胆人体| 亚洲а∨天堂久久精品9966| 日韩av日韩在线观看| 亚洲国内精品在线| 欧美日韩黄色大片| 最新国产成人av网站网址麻豆| 亚洲天堂男人天堂女人天堂| 国产在线高清精品| 久久久人成影片一区二区三区观看| 亚洲欧美另类国产| 欧美国产在线视频| 九九精品在线播放| 国产亚洲视频在线观看| 国产精品日日摸夜夜添夜夜av| 国内精久久久久久久久久人| 在线观看欧美日韩国产| 国产一区二区激情| 亚洲电影免费观看高清完整版| 精品自拍视频在线观看| 亚洲激情在线视频| 久久亚洲精品成人| 亚洲激情视频在线观看| 国产一区二区三区欧美| 精品高清一区二区三区| 国产精品91视频| 亚洲自拍欧美另类| 日韩中文字幕亚洲| 欧美性高潮在线| 日韩亚洲在线观看| 成人免费看吃奶视频网站| 久久精品国产69国产精品亚洲| 成人午夜在线视频一区| 国产一区二区在线免费视频| 亚洲高清免费观看高清完整版| 欧美极品在线播放| 中文字幕av一区| 中文字幕欧美精品日韩中文字幕| 亚洲女人被黑人巨大进入| 2021国产精品视频| 国产不卡av在线| 91av在线免费观看视频| 亚洲国产精品久久精品怡红院| 国产美女久久精品香蕉69| 国产精品夜间视频香蕉| 神马久久桃色视频| 欧美极品美女电影一区| 欧美激情欧美激情| 亚洲理论在线a中文字幕| 中文字幕日韩精品在线观看| 欧美孕妇毛茸茸xxxx| 最近2019年手机中文字幕| 麻豆一区二区在线观看| 久久精品视频在线播放| 国产精品三级美女白浆呻吟| 91美女片黄在线观| 亚洲欧美日韩图片| 热久久这里只有| 亚洲成人黄色网| 成人春色激情网| 日韩高清电影免费观看完整| 久久精品国产2020观看福利| 青青草原成人在线视频| 亚洲精品wwwww| 538国产精品一区二区免费视频| 久久久久国产一区二区三区| 55夜色66夜色国产精品视频| 一区二区三区美女xx视频| 55夜色66夜色国产精品视频| 精品亚洲一区二区三区在线播放| 91精品久久久久久综合乱菊| 久久色在线播放| 亚洲一区亚洲二区| 欧美性xxxxx极品娇小| 亚洲精品一区二区三区不| 国产精品第一视频| 日韩av快播网址| 亚洲欧美日韩视频一区| 7777精品视频| 成人高h视频在线| 91精品91久久久久久| 日韩av成人在线观看| 亚洲第一网站男人都懂| 精品国产福利视频| 久久久伊人欧美| 91精品国产色综合久久不卡98口| 色先锋资源久久综合5566| 国产精品日韩一区| 成人免费在线网址| 久热在线中文字幕色999舞| 视频一区视频二区国产精品| 精品国产91乱高清在线观看| 日韩欧美国产网站| 久久网福利资源网站| 57pao国产成人免费| 国产成+人+综合+亚洲欧美丁香花| 久久av.com| 国产精自产拍久久久久久| 91精品国产自产在线观看永久| 欧美精品激情在线观看|