• 第三方库AFNetworking 3.1.0的简单使用


    AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库.

    适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上。

    下面的类已从AFNetworking 3.0中废弃:

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager

    现在核心代码:AFHTTPSessionManager,<AFNrtworking3.1.0目前使用NSURLSession作为网络类!!!!>

    它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。

    官方链接http://cocoadocs.org/docsets/AFNetworking/1.3.0/

    重要功能梳理:

    • AFURLConnectionOperation :继承自 NSOperation 实现了NSURLConnection 的代理方法.
    • AFHTTPRequestOperation :   继承自   AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于 决定request是否成功的状态码和内容类型.
    • AFJSONRequestOperation :  继承自AFHTTPRequestOperation,用于下载和处理json response数据.
    • AFXMLRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理xml response数据.
    • AFPropertyListRequestOperation : 继承自 AFHTTPRequestOperation,用于下载和处理 property list  response数据.
    • AFHTTPClient :是一个封装了基于http协议的网络应用程序的公共交流模式.包含
      1.发起 基于根路径的使用基本的url相关路径来只做request
      2.为request自动添加设置http headers.
      3.使用http 基础证书或者OAuth来验证request
      4.为由client制作的requests管理一个NSOperationQueue
      5.从NSDictionary生成一个查询字符串或http bodies.
      6.从request中构建多部件
      7.自动的解析http response数据为相应的表现数据
      8.在网络可达性测试用监控和响应变化.

    下面我们就来看看AFNetworking的基本使用:

     1 #pragma mark - 网络监测按钮的响应方法
     2 - (IBAction)networkingMonitoringAction:(id)sender {
     3 //isOpen是自己定义的一个Bool值的属性,来切换开关网络检测这一功能.
     4     if (!self.isOpen) {
     5         //打开网络监测
     6         [[AFNetworkReachabilityManager sharedManager] startMonitoring];
     7         self.isOpen = YES;
     8     } else {
     9         //关闭网络监测
    10         [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
    11         self.isOpen = NO;
    12     }
    13     //接下来判断当前网络状态:wifi,2G/3G/4G,无网络访问
    14     [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    15         switch (status) {
    16             case AFNetworkReachabilityStatusUnknown:
    17                 NSLog(@"当前网络未知");
    18                 break;
    19             case AFNetworkReachabilityStatusNotReachable:
    20                 NSLog(@"当前无网络访问");
    21                 break;
    22             case AFNetworkReachabilityStatusReachableViaWWAN:
    23                 NSLog(@"当前手机流量网络");
    24                 break;
    25             case AFNetworkReachabilityStatusReachableViaWiFi:
    26                 NSLog(@"当前wifi连接网络");
    27                 break;
    28                 
    29             default:
    30                 break;
    31         }
    32     }];
    33 }
    网络状态检测

    //初始化session对象
        self.session = [AFHTTPSessionManager manager];
        //设置请求接口回来的时候支持什么类型的数据
    //    self.session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil];    (之前忘了,现在添加上)

    这一步必不可少,必须写明要获取数据的类型,不然会报错.

    下面我们来看看怎么实现数据请求:

     1 #pragma mark - GET请求
     2 - (IBAction)getRequestAction:(id)sender {
     3   
     4     //参数一:get请求的网址
     5     //参数二:拼接参数body
     6     //参数三:progress表示进度的意思
     7     //参数四:数据请求成功后执行的操作
     8     //参数五:请求失败后报的错误
     9     [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    10         NSLog(@"下载的进度");
    11     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    12         NSLog(@"请求成功%@", responseObject);
    13     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    14         NSLog(@"请求失败%@", error);
    15     }];
    16 }
    17 
    18 #pragma mark - post请求
    19 - (IBAction)postRequestAction:(id)sender {
    20     /*
    21     body: {
    22      do = "pri_memberlist";
    23      "member_id" = zpHr2dsRvQQxYJxo2;
    24      "workspace_id" = ILfYpE4Dhs2gWcuQx;
    25      }*/
    26    NSString *url = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    27     
    28     //一般的body都是给你一个字典类型的,需要你创建一个字典来接受存储
    29     NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    30     [dic setValue:@"pri_memberlist" forKey:@"do"];
    31     [dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
    32     [dic setValue:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"];
    33     
    34     [self.session POST:url parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
    35         NSLog(@"上传进度");
    36     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    37         NSLog(@"请求成功%@", responseObject);
    38     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    39         NSLog(@"失败啦,哈哈%@", error);
    40     }];
    41     
    42     
    43 }
    44 
    45 #pragma mark - post请求2(当body中含有汉字或特殊字符的时候,这时候需要转码)
    46 - (IBAction)postTwoRequestAction:(id)sender {
    47            /* BODY:     address = "";
    48            comment = "U7c7bU6a21U5757U8ba1U5212U7528U5230U7b2cU4e09U90e8U5206U4e2dUff0cU5f85U63d0U95eeU3001U56deU7b54U79efU7d2fU5230U4e00U5b9aU6570U91cfU65f6Uff0cU4fbfU4e8eU5927U5bb6U7684U95eeU9898U7684U5febU901fU67e5U627eUff0cU6240U4ee5U63d0U95eeU90e8U5206U6682U65f6U4e0dU52a0U5165U8fd9U4e2a";
    49            do = "add_comment";
    50            kind = task;
    51            "member_id" = zpHr2dsRvQQxYJxo2;
    52            other = "";
    53            "task_id" = 55a47e79ec25e3641;*/
    54     
    55     NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    56     
    57     NSString *comment = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
    58     //对汉字进行转码操作
    59     comment = [comment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    60     
    61     NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    62     [dic setValue:@"" forKey:@"address"];
    63     [dic setValue:comment forKey:@"comment"];
    64     [dic setValue:@"add_comment" forKey:@"do"];
    65     [dic setValue:@"task" forKey:@"kind"];
    66     [dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
    67     [dic setValue:@"" forKey:@"other"];
    68     [dic setValue:@"55a47e79ec25e3641" forKey:@"task_id"];
    69     
    70     //请求报文
    71     [self.session POST:urlStr parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
    72         NSLog(@"上传进程%@", uploadProgress);
    73     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    74         NSLog(@"请求成功%@", responseObject);
    75     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    76         NSLog(@"请求失败%@", error);
    77     }];
    78     
    79     //可以看到,在第三方库中,我们直接就可以调用GET和POST请求方法,不用像以前一样,写那么多行代码了,大大简化了代码量
    80 }
    GET和POST数据请求

     注意:AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)
    URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


     

  • 相关阅读:
    android listview 的弹性滑动 简单demo 实现
    android轻松监听来电和去电
    android有效的获取图像和视频
    android项目源码异步加载远程图片的小例子
    Android游戏开发系统控件CheckBox
    Android Gallery3D效果 教程 案例 代码
    Android 桌面组件【app widget】 进阶项目心情记录器
    基于ListView和CheckBox实现多选和全选记录的功能
    Android上传文件到服务器中的简单实例
    最小边覆盖(最小路径覆盖)(路径可相交)——pku2594
  • 原文地址:https://www.cnblogs.com/lovebugssun/p/5536838.html
Copyright © 2020-2023  润新知