美文网首页面试iOSios开发
iOS基础-AFNetWorking的简单总结

iOS基础-AFNetWorking的简单总结

作者: 云之君兮鹏 | 来源:发表于2016-07-21 17:34 被阅读2118次

    别来沧海事,语罢暮天钟<莲叶童子>

    AFNetWorking:

    • AFNetworking是一个 在iOS开发中使用非常多的网络开源库
    • 是用于iOS以及Mac OS X . 构建于在(Apple iOS开发文档)NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上.
    • 他拥有良好的架构, 丰富的api, 以及模块化构建方式, 使得使用起来非常轻松
      官方链接

    使用AFNetworking进行网络判断
    使用AFNetworking进行GET和POST请求

    1、AFNetworking是一个轻量级的iOS网络通信类库。

    2、它建立在NSURLConnection和NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单。

    3、它支持HTTP请求和基于REST的网络服务(包括GET、POST、 PUT、DELETE等)。

    4、支持ARC。

    • 开始设计 AFNetWorking 思路

    AFNetworking是基于NSURLConnection和NSOperation的
    1: NSURLConnection是处理网络连接的。
    2: NSOperation是管理NSURLConnection的,可以监视一个请求的生命周期。

    • NSOperation相关类 (AFNetWorking比较关键的类)

    1: AFURLConnectionOperation:NSOperation的子类,实现了NSURLConnection 的代理方法。将网络请求依附到一个operation上。从而让我们能够有效的控制并观察一个网络请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态

    2、AFHTTPRequestOperation:AFURLConnectionOperation的子类,针对request使用的协议为HTTP和HTTPS。它封装的可接受状态码和内容的类型,判定一个请求结果是成功或失败

    3、AFHTTPRequestOperationManager:(核心类) 封装了一组调用请求的方法---封装完成了一种通用的模式,可以帮助我们完成请求的创建、响应的系列化,网络状态的监控以及安全策略以及每一个请求operation的管理

    • iOS7.0之后AFNetWorking进一步完善的类

    1: AFURLSessionManager:创建、管理基于 NSURLSessionConfiguration 对象的 NSURLSession 对象的类,也可以管理 session 的数据、下载/上传任务,实现 session 和其相关联的任务的 delegate 方法。

    2、AFHTTPSessionManager:封装了一组调用请求的方法。

    • AFNetworking针对请求和响应的序列化进行的单独的封装

    1、AFURLRequestSerialization:合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header。

    2、AFURLResponseSerialization:符合这个协议的对象用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于 Mantle 的模型对象。

    • AFNetworking可以检测当前网络的可达性。

    1: AFNetworkReachabilityManager:这个类监控当前网络的可达性网络的连通状态监控以及网络的类型。,提供回调 block 和 notificaiton,在可达性变化时调用。实际是将苹果官方提供的Reachability的类名和通知名更换了一下,防止和系统提供的类的通知名以及类名的冲突。

    • AFNetworking提供了请求的安全策略。

    1、AFSecurityPolicy:评估服务器对安全连接针对指定的固定证书或公共密钥的信任。将你的服务器证书添加到 app bundle,以帮助防止 中间人攻击。

    • 两个重要的协议
    • AFURLRequestSerialization
      1:符合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header。
      2:构建multipart请求。
    • AFURLResponseSerialization
      遵循AFURLResponseSerialization协议的对象,用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于mantle的模型对象。
    这个我也用的不太熟练,搜集了一些基础知识供大家参考, 下面几个简单的代码例子,欢迎大家指正
    #pragma mark -------- GET 请求 ------------
    - (void)get
    {
    // 创建请求 Manager 对象
        AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
        
      [mgr GET:@"GET_URL" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
           // responseObject 里面, 是请求成功以后返回的字典或者数据, 然后对其进行解析
            NSLog(@"GET 请求成功: %@", responseObject);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"GET 请求失败: %@ ", error);
        }];
    }
    
    #pragma mark -------- POST 请求 --------------
    - (void)post
    {// 创建请求对象
        AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager new];
        
    // 设置请求参数为 JSON 格式 
        mgr.requestSerializer = [AFJSONRequestSerializer serializer];
    // 设置响应序列化为二进制   
      mgr.responseSerializer = [AFJSONResponseSerializer serializer];
        
    // 设置一个 Body
        NSDictionary *dic = @{@"date":@"20131129",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",@"terminalType":@"Iphone",@"cid":@"213"};   
        [mgr POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject){
        
            NSLog(@"POST 请求成功: %@",responseObject);
    //        NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    //        NSLog(@"%@",str);
     
    } failure:^(AFHTTPRequestOperation *operation, NSError *error){
        NSLog(@"POST 请求失败: %@",error);
    }];
    
    
    #pragma mark -------  下载 ---------
    - (void)DownLoad
    {
    // 创建一个用来分别配置每一个 session 对象的配置类
     //  defaultSessionConfiguration : 是session默认配置, 使用硬盘内存来存储缓存数据
        
        NSURLSessionConfiguration *Configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    // 创建 manager 管理对象
        AFURLSessionManager *mgr = [[AFURLSessionManager alloc] initWithSessionConfiguration:Configuration];
    
    // 下载内容的接口 百度的一张照片
        NSURL *url = [NSURL URLWithString:@"http://a2.att.hudong.com/36/41/01300000281228122578414333627.jpg"];
    
    // 创建请求
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 创建下载任务
        NSURLSessionDownloadTask *task = [mgr downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
            // block 需要返回值 就是你要存的位置
            NSURL *path = [[NSFileManager defaultManager] URLForDirectory:(NSDocumentDirectory) inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
            // 返回和服务器文件名一样, 当我们希望保存的文件名和服务器的文件名一致的时候, 可以使用这个名字: suggestedFilename
            return [path URLByAppendingPathComponent:[response suggestedFilename]];
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            NSLog(@"打印下载的路径: %@",filePath);
        }];
    
        [task resume];
    }
    
    #pragma mark ----------- 文件上传 ---------
    
    - (void)UpLoad
    {
    // 创建一个用来分别配置每一个 session 对象的类
    //  defaultSessionConfiguration : 是session默认配置, 使用硬盘内存来存储缓存数据
        
        NSURLSessionConfiguration *Configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    // 创建 manager 管理对象
        AFURLSessionManager *mgr = [[AFURLSessionManager alloc] initWithSessionConfiguration:Configuration];
        
        // 将东西上传到的接口
        NSURL *url = [NSURL URLWithString:@""];
    
    // 创建请求
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
    // 将要上传文件的路径
        NSURL *path = [NSURL fileURLWithPath:@"电脑路径"];
    
      
    //创建任务
        NSURLSessionUploadTask *task = [mgr uploadTaskWithRequest:request fromFile:path progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
            if (error)
            {
                NSLog(@"上传失败 ---- %@",error);
            }else
            {
                NSLog(@"上传成功----%@-----%@",response, responseObject);
            }
        }];
       
        [task resume];
    
    }
    
    #pragma mark ---- 网络判断 -------
    - (void)reachbility
    {
    // 创建网络监听管理者对象
        AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
    // 设置监听
    [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status)
        {
            
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未识别的网路");
                break;
               
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"2G 3G 4G 网络");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;
            
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"不可达的(未连接的)");
                break;
            
            default:
                break;
        }
    }];
        
        // 开启监听
        [mgr startMonitoring];
        
    }
    

    相关文章

      网友评论

      • 717b3c1dd1e3:AFNetworking 3.0了
        下面三个是弃用类
        AFURLConnectionOperation
        AFHTTPRequestOperation
        AFHTTPRequestOperationManager

        GET POST 请求
        AFHTTPSessionManager
        云之君兮鹏:@三三_lily 恩 标注了 可能不是很清楚 谢谢的提醒
      • code_间特门:好的很呐,我之前就知道Post和Get,这下脑补了 :wink:

      本文标题:iOS基础-AFNetWorking的简单总结

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