第三方库AFNetworking 3.1.0的简单使用
Posted 24桥明月夜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三方库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 = "\\U7c7b\\U6a21\\U5757\\U8ba1\\U5212\\U7528\\U5230\\U7b2c\\U4e09\\U90e8\\U5206\\U4e2d\\Uff0c\\U5f85\\U63d0\\U95ee\\U3001\\U56de\\U7b54\\U79ef\\U7d2f\\U5230\\U4e00\\U5b9a\\U6570\\U91cf\\U65f6\\Uff0c\\U4fbf\\U4e8e\\U5927\\U5bb6\\U7684\\U95ee\\U9898\\U7684\\U5feb\\U901f\\U67e5\\U627e\\Uff0c\\U6240\\U4ee5\\U63d0\\U95ee\\U90e8\\U5206\\U6682\\U65f6\\U4e0d\\U52a0\\U5165\\U8fd9\\U4e2a"; 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 }
注意:AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)
URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
以上是关于第三方库AFNetworking 3.1.0的简单使用的主要内容,如果未能解决你的问题,请参考以下文章
swift 中使用OC第三方库(以AFNetworking为例)