AFN基本使用技巧

1.AFN使用技巧

1.在開發的時候可以創建一個工具類,繼承自我們的AFN中的請求管理者,再控制器中真正發請求的代碼使用自己封裝的工具類。2.這樣做的優點是以后如果修改了底層依賴的框架,那么我們修改這個工具類就可以了,而不用再一個一個的去修改。3.該工具類一般提供一個單例方法,在該方法中會設置一個基本的請求路徑。4.該方法通常還會提供對GET或POST請求的封裝。5.在外面的時候通過該工具類來發送請求6.單例方法:+ (instancetype)shareNetworkTools{staticXMGNetworkTools *instance;staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{// 注意: BaseURL中一定要以/結尾instance = [[selfalloc] initWithBaseURL:[NSURLURLWithString:@"http://120.25.226.186:32812/"]];? ? });returninstance;}

2.AFN文件上傳

1.文件上傳拼接數據的第一種方式[formData appendPartWithFileData:data name:@"file"fileName:@"xxoo.png"mimeType:@"application/octet-stream"];2.文件上傳拼接數據的第二種方式 [formData appendPartWithFileURL:fileUrl name:@"file"fileName:@"xx.png"mimeType:@"application/octet-stream"error:nil];3.文件上傳拼接數據的第三種方式 [formData appendPartWithFileURL:fileUrl name:@"file"error:nil];4.【注】在資料中已經提供了一個用于文件上傳的分類。/*文件上傳相關的代碼如下*/-(void)upload{//1.創建一個請求管理者AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//2.發送POST請求上傳數據/*

第一個參數:請求路徑:NSString類型

第二個參數:要上傳的非文件參數

第三個參數:block回調

在該回調中,需要利用formData拼接即將上傳的二進制數據

第三個參數:上傳成功的block回調

task:dataTask(任務)

responseObject:服務器返回的數據

第四個參數:上傳失敗的block回調

error:錯誤信息,如果上傳文件失敗,那么error里面包含了錯誤的描述信息

*/NSDictionary*dict = @{@"username":@"wenidngding"};? ? [manager POST:@"http://120.25.226.186:32812/upload"parameters:dict constructingBodyWithBlock:^(id? _Nonnull formData) {//把本地的圖片轉換為NSData類型的數據UIImage*image = [UIImageimageNamed:@"123"];NSData*data = UIImagePNGRepresentation(image);/*

//拼接二進制文件數據

第一個參數:要上傳的文件的二進制數據

第二個參數:服務器接口規定的名稱

第三個參數:這個參數上傳到服務器之后用什么名字來進行保存

第四個參數:上傳文件的MIMEType類型

*/[formData appendPartWithFileData:data name:@"file"fileName:@"xxoo.png"mimeType:@"application/octet-stream"];? ? } success:^(NSURLSessionDataTask* _Nonnull task,id_Nonnull responseObject) {NSLog(@"請求成功---%@",responseObject);? ? } failure:^(NSURLSessionDataTask* _Nonnull task,NSError* _Nonnull error) {NSLog(@"請求失敗--%@",error);? ? }];}-(void)upload2{NSLog(@"%s",__func__);//1.創建一個請求管理者AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//2.發送POST請求上傳數據/*

第一個參數:請求路徑:NSString類型

第二個參數:要上傳的非文件參數

第三個參數:block回調

在該回調中,需要利用formData拼接即將上傳的二進制數據

第三個參數:上傳成功的block回調

task:dataTask(任務)

responseObject:服務器返回的數據

第四個參數:上傳失敗的block回調

error:錯誤信息,如果上傳文件失敗,那么error里面包含了錯誤的描述信息

*/NSDictionary*dict = @{@"username":@"wenidngding"};? ? [manager POST:@"http://120.25.226.186:32812/upload"parameters:dict constructingBodyWithBlock:^(id? _Nonnull formData) {//本地文件的urlNSURL*fileUrl = [NSURLfileURLWithPath:@"/Users/文頂頂/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];/*

//拼接二進制文件數據

第一個參數:要上傳文件的url路徑

第二個參數:服務器要求的參數名稱

第三個參數:這個文件上傳到服務器之后叫什么名稱

第四個參數:文件的mimetype類型

第五個參數:錯誤信息

*///? ? ? ? [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];//另外一種上傳文件的方式/*

說明:該方法和上面的方法等價,不過該方法更加簡單其內部會自動的的根據url路徑確定文件保存名稱,并通過內部方法獲取上傳文件的mimetype類型

*/[formData appendPartWithFileURL:fileUrl name:@"file"error:nil];? ? } success:^(NSURLSessionDataTask* _Nonnull task,id_Nonnull responseObject) {NSLog(@"請求成功---%@",responseObject);? ? } failure:^(NSURLSessionDataTask* _Nonnull task,NSError* _Nonnull error) {NSLog(@"請求失敗--%@",error);? ? }];}

3.使用AFN進行序列化處理

/*

1.AFN它內部默認把服務器響應的數據當做json來進行解析,所以如果服務器返回給我的不是JSON數據那么請求報錯,這個時候需要設置AFN對響應信息的解析方式。AFN提供了三種解析響應信息的方式,分別是:

1)AFXMLParserResponseSerializer----XML

2) AFHTTPResponseSerializer---------默認二進制響應數據

3)AFJSONResponseSerializer---------JSON

2.還有一種情況就是服務器返回給我們的數據格式不太一致(開發者工具Content-Type:text/xml),那么這種情況也有可能請求不成功。解決方法:

1) 直接在源代碼中修改,添加相應的Content-Type

2) 拿到這個屬性,添加到它的集合中

3.相關代碼

-(void)srializer

{

//1.創建請求管理者,內部基于NSURLSession

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

/* 知識點1:設置AFN采用什么樣的方式來解析服務器返回的數據*///如果返回的是XML,那么告訴AFN,響應的時候使用XML的方式解析manager.responseSerializer= [AFXMLParserResponseSerializer serializer];//如果返回的就是二進制數據,那么采用默認二進制的方式來解析數據//manager.responseSerializer = [AFHTTPResponseSerializer serializer];//采用JSON的方式來解析數據//manager.responseSerializer = [AFJSONResponseSerializer serializer];/*知識點2 告訴AFN,再序列化服務器返回的數據的時候,支持此種類型? ? [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];? ? //2.把所有的請求參數通過字典的方式來裝載,GET方法內部會自動把所有的鍵值對取出以&符號拼接并最后用?符號連接在請求路徑后面? ? NSDictionary *dict = @{? ? ? ? ? ? ? ? ? ? ? ? ? @"username":@"223",? ? ? ? ? ? ? ? ? ? ? ? ? @"pwd":@"ewr",? ? ? ? ? ? ? ? ? ? ? ? ? @"type":@"XML"? ? ? ? ? ? ? ? ? ? ? ? ? };? ? //3.發送GET請求? ? [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id? _Nonnull responseObject) {? ? ? ? //4.請求成功的回調block? ? ? ? NSLog(@"%@",[responseObject class]);? ? } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {? ? ? ? //5.請求失敗的回調,可以打印error的值查看錯誤信息? ? ? ? NSLog(@"%@",error);? ? }];}

4.使用AFN來檢測網絡狀態

/*

說明:可以使用AFN框架中的AFNetworkReachabilityManager來監聽網絡狀態的改變,也可以利用蘋果提供的Reachability來監聽。建議在開發中直接使用AFN框架處理。

*///使用AFN框架來檢測網絡狀態的改變-(void)AFNReachability{//1.創建網絡監聽管理者AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];//2.監聽網絡狀態的改變/*

AFNetworkReachabilityStatusUnknown? ? ? ? ? = 未知

AFNetworkReachabilityStatusNotReachable? ? = 沒有網絡

AFNetworkReachabilityStatusReachableViaWWAN = 3G

AFNetworkReachabilityStatusReachableViaWiFi = WIFI

*/[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {switch(status) {caseAFNetworkReachabilityStatusUnknown:NSLog(@"未知");break;caseAFNetworkReachabilityStatusNotReachable:NSLog(@"沒有網絡");break;caseAFNetworkReachabilityStatusReachableViaWWAN:NSLog(@"3G");break;caseAFNetworkReachabilityStatusReachableViaWiFi:NSLog(@"WIFI");break;default:break;? ? ? ? }? ? }];//3.開始監聽[manager startMonitoring];}------------------------------------------------------------//使用蘋果提供的Reachability來檢測網絡狀態,如果要持續監聽網絡狀態的概念,需要結合通知一起使用。//提供下載地址:https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{//1.注冊一個通知[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];//2.拿到一個對象,然后調用開始監聽方法Reachability *r = [Reachability reachabilityForInternetConnection];? ? [r startNotifier];//持有該對象,不要讓該對象釋放掉self.r= r;}//當控制器釋放的時候,移除通知的監聽-(void)dealloc{? ? [[NSNotificationCenterdefaultCenter] removeObserver:self];}-(void)networkChange{//獲取當前網絡的狀態if([Reachability reachabilityForInternetConnection].currentReachabilityStatus== ReachableViaWWAN)? ? {NSLog(@"當前網絡狀態為3G");return;? ? }if([Reachability reachabilityForLocalWiFi].currentReachabilityStatus== ReachableViaWiFi)? ? {NSLog(@"當前網絡狀態為wifi");return;? ? }NSLog(@"當前沒有網絡");}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容