zoukankan      html  css  js  c++  java
  • iOS开发之AFN的基本使用

    本篇将从四个方面对iOS开发中经常使用到的AFNetworking框架进行讲解:

    一、什么是 AFN

    二、为什么要使用 AFN

    三、AFN 怎么用

    三、AFN和ASI的区别


    一、什么是 AFN

    AFN 全称为 AFNetworking,是一个构建与在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架。


    二、为什么要使用 AFN

    AFN 对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松.。


    三、AFN 怎么用和他的几种使用方法

    AFN 主要使用在2个场景中:

    一、发送网络请求

    二、实时监测网络状态

    AFHTTPRequestOperationManager:内部封装的是 NSUrlConnection,网络请求管理类,用来负责发送网络请求,是使用最多的一个类.

    AFHTTPSessionManager :内部封装的是 NSUrlSession,网络请求管理类,用来负责发送网络请求,是使用做多的一个类.

    两个网络请求管理类定义的 API 完全相同:

    [[AFHTTPRequestOperationManager manager] GET:nil parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //
    }];
    
    [[AFHTTPSessionManager manager] GET:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        //
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        //
    }];

    一些主要的工具类:

    AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.

    AFSecurityPolicy.h :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.发送网络请求 

    NSDictionary *dict = @{@"username":@"zhangsan",@"password":@"zhang"};
    
    [[AFHTTPSessionManager manager] POST:@"http://localhost/login/login.php" 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);
    }];
    
    [[AFHTTPSessionManager manager] GET:@"http://localhost/login/login.php" 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);
    }];

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

     3.2 AFN 3.0之后的网络接口相比之前的网络接口多了一个参数:网络进度.

     参数:

         1. urlString: 网络接口地址.

         2. parameters: 参数字典.key:服务器接收普通参数的key值,value就是参数内容.

         3. progress: 网络进度

         4. success: 成功回调

         5. failure: 失败回调

     3.3 AFN根据 response.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.创建管理者

    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    2.封装请求参数 

    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"username"] = @"哈哈哈";
    params[@"pwd"] = @"123";

    3.发送请求

    NSString *url = @"http://localhost:8080/Server/login";
    [mgr POST:url parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          // 请求成功的时候调用这个block
          NSLog(@"请求成功---%@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          // 请求失败的时候调用调用这个block
          NSLog(@"请求失败");
      }];
    // GET请求
    [mgr GET:url parameters:params
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          // 请求成功的时候调用这个block
          NSLog(@"请求成功---%@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          // 请求失败的时候调用调用这个block
          NSLog(@"请求失败");
      }];

    三、对服务器返回数据的解析

    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];

    3.注意

    * 服务器返回的数据一定要跟responseSerializer对得上

    1> 服务器返回的是JSON数据

    * AFJSONResponseSerializer

    * AFHTTPResponseSerializer

    2> 服务器返回的是XML数据

    * AFXMLParserResponseSerializer

    * AFHTTPResponseSerializer

    3> 服务器返回的是其他数据

    * AFHTTPResponseSerializer

    四、实时监测网络状态

    可利用 AFN 实时监测网络状态.

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

    一、底层实现

    1> AFN的底层基于OC的NSURLConnection和NSURLSession

    2> ASI的底层基于纯C语言的CFNetwork框架

    3> ASI的运行性能 高于 AFN

    二、对服务器返回的数据处理

    1> ASI没有直接提供对服务器数据处理的方式,直接返回datastring

    2> AFN提供了多种对服务器数据处理的方式

    * JSON处理

    * XML处理

    * 其他处理

    三、监听请求的过程

    1> AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)(3.0以后添加了进度)

    * success : 请求成功后调用

    * failure : 请求失败后调用

    2> ASI提供了3套方案,每一套方案都能监听请求的完整过程

    (监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)

    * 成为代理,遵守协议,实现协议中的代理方法

    * 成为代理,不遵守协议,自定义代理方法

    * 设置block

    四、在文件下载和文件上传的使用难易度

    1> AFN

    * 不容易监听下载进度和上传进度

    * 不容易实现断点续传

    * 一般只用来下载不大的文件

    2> ASI

    * 非常容易实现下载和上传

    * 非常容易监听下载进度和上传进度

    * 非常容易实现断点续传

    * 下载或大或小的文件都行

    五、ASI提供了更多的实用功能

    1> 控制圈圈要不要在请求过程中转

    2> 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象

    3> 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)

    * 暂停恢复取消所有的请求

    * 监听整个队列中所有请求的下载进度和上传进度

  • 相关阅读:
    LeetCode 224. 基本计算器 栈 双指针
    LeetCode 150. 逆波兰表达式求值 栈
    LeetCode 387. 字符串中的第一个唯一字符 哈希
    LeetCode 316. 去除重复字母 栈 哈希
    LeetCode 44. 通配符匹配 dp
    禁止屏幕旋转并同时解决以至于导致Activity重启的方法
    让振动器振动起来——Vibrator的使用
    简单的JDBC封装
    js jquery ajax 清除ie下的缓存问题
    angular.js 下拉框选中 根据后台返回值
  • 原文地址:https://www.cnblogs.com/Jepson1218/p/5215667.html
Copyright © 2011-2022 走看看