AFNetWorking

https://zhuanlan.zhihu.com/p/22408943 参考文章


AFN主要使用在2个场景中
1.发送网络请求
2.实时监测网络状态


AFHTTPRequestOperationManager:内部封装了NSUrlConnection,网络请求管理类,用来负责发送网络请求;
AFHTTPSessionManager :内部封装的是NSUrlSession,其内容同上,苹果推荐使用NSUrlsession;


主要的工具类:
AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.
AFSecurityPolicy :HTTPS 需要使用.
AFURLRequestSerialization: 数据解析的时候会使用.
AFHTTPRequestSerializer: 万能解析器/对服务器返回的数据不做任务处理.
AFJSONResponseSerializer: JSON解析器.
AFXMLParserResponseSerializer: XML解析器.
AFHTTPRequestOperationManager :对NSURLConnection的封装.
AFHTTPSessionManager :对NSURLSession的封装.

一.AFHTTPSessionManager 用法:

1.创建管理者:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

2.设置管理者的数据解析类型,默认为json格式的解析,可手动修改为其他类型,如XML:

manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

3.发送请求 <1.首先要明确发送的是什么类型的请求(GET/POST/HEAD...)


AFN3.0之后的网络接口比原来的多了一个参数-->网络进度>:
参数:
URLString:网络接口地址;
Parameters:参数字典key:服务器接收普通参数的key值;
value:参数内容;
Progress:网络进度;
Success:成功回调;
Failure:失败回调;
1.POST--mark
NSDictionary *dict = @{@"US":@"guerdan",@"PW":@"shushi"};
NSString * url = @"http://localhost/login/login.php";
[[AFHTTPSessionManager manager]POST:url parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
    //下载进度
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    //请求成功返回结果
    NSLog(@"responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    //请求失败,打印错误
    NSLog(@"error:%@",error);
}];
2.GET --mark
[[AFHTTPSessionManager manager] GET:url parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {
    //下载进度
    NSLog(@"%@",downloadProgress);   
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) { 
    //请求成功返回结果
    NSLog(@"responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    //请求失败,打印错误
    NSLog(@"error:%@",error);
}];


⭐️:AFN根据respone.MIMEType判断服务器返回数据类型.如果类型不匹配,但是又是JSON数据,解决方案:

1.改变解析器类型为:万能解析器 --> 手动解析JSON

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

2.改变判断条件的类型,从而使类型匹配,acceptableContentTypes默认情况下无 text/plain类型

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/plain",nil];

⚡️⚡️⚡️ 如果没有使用第三方框架(CocoaPods)来管理第三方框架,可以直接修改第三方框架的源代码.


二.AFHTTPRequestOperationManager

对服务器返回数据的解析:

1.AFN可以自动对服务器返回的数据进行解析 --> 默认将服务器返回的数据当做JSON来解析
2.设置对服务器返回数据的解析方式

1.当做JSON来解析<默认做法>
mgr.responseSerializer = [AFJSONResponseSerializer serializer];
responseObject的类型是NSDictionary或者NSArray
2.当做是XML来解析
 mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
 responseObject的类型是NSXMLParser
3.直接返回Data ->告诉AFN不要去解析服务器返回的数据,保持原来的data即可
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

☣️:服务器返回的数据一定要跟ResponeSerializer对的上


三.实时监测网络状态:

AFNetworkReachabilityManager 实时检测网络状态改变的类
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 设置网络状态改变之后的操作
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    // status :当前的网络状态.
    //        AFNetworkReachabilityStatusUnknown
    //        AFNetworkReachabilityStatusNotReachable
    //        AFNetworkReachabilityStatusReachableViaWWAN
    //        AFNetworkReachabilityStatusReachableViaWiFi
    switch (status) {
        case AFNetworkReachabilityStatusUnknown:
            NSLog(@"未知的网络状态");
            break;
        case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"没有网络");
            break;
        case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"蜂窝移动网络");
            break;
        case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"WIFI网络");
            break;
        default:
            break;
    }
}];
// 开始检测网络状态
[manager startMonitoring];

四.支持 HTTPS 网络安全传输协议下的访问

HTTPS = HTTP(超文本传输协议) + SSL (安全连接层) HTTP 的安全版本.
HTTPS会专门建立一个安全的数据传输通道来传输数据,外界拿不到任何数据,现阶段最安全的协议;目前在HTTP模式下三大运营商发送的恶意广告泛滥,并且可以获得用户的个人信息;HTTPS需要数字验证,目前很多大公司使用的数字验证都是默认支持的.

[manager GET:@"https://mail.itcast.cn" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    //
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSData *data = responseObject;
    NSLog(@"成功:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"失败:%@",error);
}];

⚡️⚡️⚡️AFN默认情况下就是支持HTTPS访问的,但是如果用HTTPS的方式访问未受信任的网站便会报错,解决方案:
修改对SSL的检测:

AFN3.0之前:
manager.securityPolicy.allowInvalidCertificates = YES;
AFN3.0之后
manager.securityPolicy.validatesDomainName = NO;

五.AFN和ASI的区别

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335