AFNetworking是一款在OS X和iOS下都使人喜好的網絡庫。爲了迎合iOS新版本的升級, AFNetworking在3.0版本中刪除了基於 NSURLConnection API的全部支持。若是你的項目之前使用過這些API,建議您當即升級到基於 NSURLSession 的API的AFNetworking的版本。javascript
NSURLConnection的API已廢棄html
AFNetworking 1.0創建在NSURLConnection的基礎API之上 ,AFNetworking 2.0開始使用NSURLConnection的基礎API ,以及較新基於NSURLSession的API的選項。 AFNetworking 3.0現已徹底基於NSURLSession的API,這下降了維護的負擔,同時支持蘋果加強關於NSURLSession提供的任何額外功能。因爲Xcode 7中,NSURLConnection的API已經正式被蘋果棄用。雖然該API將繼續運行,但將沒有新功能將被添加,而且蘋果已經通知全部基於網絡的功能,以充分使NSURLSession向前發展。java
// ViewController.m // 網絡工具類 // // Created by mac on 15/12/7. // Copyright © 2015年 mac. All rights reserved. #import "ViewController.h" #import <AFNetworking/AFNetworking.h> #import "NetWorkTools.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [[NetWorkTools shareTools]request:POST urlString:@"post" parameters:@{@"name":@"zhangsan",@"age":@13} finished:^(id responseObject, NSError *error) { if (error != nil) { NSLog(@"%@",error); return; } NSLog(@"%@",responseObject); }]; } @end
// NetWorkTools.h // 網絡工具類 #import <AFNetworking/AFNetworking.h> typedef enum : NSUInteger { GET, POST, } TKRequestMethod; @interface NetWorkTools : AFHTTPSessionManager +(instancetype)shareTools; -(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished; @end
作網絡框架開發人員測試網絡請求GET、POST的測試網址: json
http://httpbin.org
// NetWorkTools.mapi
// // NetWorkTools.m // 網絡工具類 // Created by mac on 15/12/7. // Copyright © 2015年 mac. All rights reserved. // #import "NetWorkTools.h" @implementation NetWorkTools +(instancetype)shareTools{ static NetWorkTools *tools; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //注意: 末尾須要包含 ‘/’ //一個App一般訪問的服務器是固定的 NSURL *url =[NSURL URLWithString:@"http://httpbin.org/"]; tools =[[self alloc]initWithBaseURL:url]; tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]; }); return tools; } -(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished;{ // //普通的 比較low的寫法 if (method ==GET) { [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { finished(responseObject,nil); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { finished(nil,error); }]; }else{ [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { finished(responseObject,nil); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { finished(nil,error); }]; } } @end
關於上面單例建立中 initWithBaseURL 的問題安全
/**服務器
AFN 最多見的網絡請求錯誤網絡
1. 不支持的內容 status code == 200,須要修改反序列化的 NSSet app
2. status code == 405,對應的 URL 不支持 HTTP 請求方法框架
*/
而後繼續,在GET 和POST 方法中,點進去發現,除了傳入的字符串不一樣,其餘的沒什麼區別
可是 dataTaskWithHTTPMethod 這個方法是定義在 .m文件中的一個使用方法,那咱們應該怎樣才能拿到它使用?在保證不修改框架自己的前提下,咱們嘗試另外一種方法,僅在OC中有效
利用協議調用AFN底層網絡方法封裝框架
// NetWorkTools.m // 網絡工具類 // // Created by mac on 15/12/7. // Copyright © 2015年 mac. All rights reserved. // #import "NetWorkTools.h" @protocol NetWorkToolsProtk <NSObject> /// 網絡請求方法 /// /// @param method HTTP請求方法 /// @param URLString URLString /// @param parameters 參數字典 /// @param success 成功回調 /// @param failure 失敗回調 /// /// @return NSURLSessionDataTask @optional //忽略警告 - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method URLString:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure; @end //遵照網絡協議 --意味着智能提示有了 /// 遵照網絡協議 - 爲了可以欺騙 Xcode 給一個智能提示,以及編譯經過!!! @interface NetWorkTools () <NetWorkToolsProtk> @end @implementation NetWorkTools +(instancetype)shareTools{ static NetWorkTools *tools; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //注意: 末尾須要包含 ‘/’ //一個App一般訪問的服務器是固定的 NSURL *url =[NSURL URLWithString:@"http://httpbin.org/"]; tools =[[self alloc]initWithBaseURL:url]; tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]; }); return tools; } -(void)request:(TKRequestMethod)method urlString:(NSString *)urlString parameters:(id)parameters finished:(void (^)(id responseObject,NSError *error))finished{ NSString *methodName = (method ==GET)? @"GET":@"POST"; // dataTaskWithHTTPMethod本類沒有實現方法,可是父類實現了 // 在調用方法的時候,若是本類沒有提供,直接調用父類的方法,AFN 內部已經實現! [[self dataTaskWithHTTPMethod:methodName URLString:urlString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { finished(responseObject,nil); } failure:^(NSURLSessionDataTask *task, NSError *error) { finished(nil,error); }]resume]; // if (method ==GET) { // [self GET:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { // // finished(responseObject,nil); // // } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // // finished(nil,error); // }]; // // }else{ // // [self POST:urlString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { // // finished(responseObject,nil); // // } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // // finished(nil,error); // }]; // } @end
封裝的時候利用了OC的特色,或者是說漏洞,能夠體會一下Objective-C語言的嚴謹性,也是OC不安全性的一個表現。AFN內部私有的一個方法,咱們經過協議的方式,將它的定義拿出來,這樣咱們就好像能夠隨心所欲了...可是你若是調用apple的api,它不會讓你上架... 固然,在Swift中這樣確定不行。