美文网首页
AFNetWorking

AFNetWorking

作者: Gunks | 来源:发表于2020-10-26 15:15 被阅读0次

    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的区别

    相关文章

      网友评论

          本文标题:AFNetWorking

          本文链接:https://www.haomeiwen.com/subject/ckqamktx.html