博客原文:http://my.oschina.net/TaciturnKnightYQ/blog/540661
AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。
NSURLConnection的API已废弃
AFNetworking 1.0建立在NSURLConnection的基础API之上 ,AFNetworking 2.0开始使用NSURLConnection的基础API ,以及较新基于NSURLSession的API的选项。 AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外功能。由于Xcode 7中,NSURLConnection的API已经正式被苹果弃用。虽然该API将继续运行,但将没有新功能将被添加,并且苹果已经通知所有基于网络的功能,以充分使NSURLSession向前发展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 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 |
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 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的测试网址:
?
1 |
http://httpbin.org |
// NetWorkTools.m
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// // 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
2. status code == 405,对应的 URL 不支持 HTTP 请求方法
*/
然后继续,在GET 和POST 方法中,点进去发现,除了传入的字符串不同,其他的没什么区别
但是 dataTaskWithHTTPMethod 这个方法是定义在 .m文件中的一个使用方法,那我们应该怎样才能拿到它使用?在保证不修改框架本身的前提下,我们尝试另一种方法,仅在OC中有效
利用协议调用AFN底层网络方法封装框架
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// 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中这样肯定不行。