第三方库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的基本使用:

 #pragma mark - 网络监测按钮的响应方法
- (IBAction)networkingMonitoringAction:(id)sender {
//isOpen是自己定义的一个Bool值的属性,来切换开关网络检测这一功能.
if (!self.isOpen) {
//打开网络监测
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
self.isOpen = YES;
} else {
//关闭网络监测
[[AFNetworkReachabilityManager sharedManager] stopMonitoring];
self.isOpen = NO;
}
//接下来判断当前网络状态:wifi,2G/3G/4G,无网络访问
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"当前网络未知");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"当前无网络访问");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"当前手机流量网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"当前wifi连接网络");
break; default:
break;
}
}];
}

网络状态检测

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

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

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

 #pragma mark - GET请求
- (IBAction)getRequestAction:(id)sender { //参数一:get请求的网址
//参数二:拼接参数body
//参数三:progress表示进度的意思
//参数四:数据请求成功后执行的操作
//参数五:请求失败后报的错误
[self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"下载的进度");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求成功%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败%@", error);
}];
} #pragma mark - post请求
- (IBAction)postRequestAction:(id)sender {
/*
body: {
do = "pri_memberlist";
"member_id" = zpHr2dsRvQQxYJxo2;
"workspace_id" = ILfYpE4Dhs2gWcuQx;
}*/
NSString *url = @"http://m.taskwedo.com/API/wedo1/wedo.php"; //一般的body都是给你一个字典类型的,需要你创建一个字典来接受存储
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:@"pri_memberlist" forKey:@"do"];
[dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
[dic setValue:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"]; [self.session POST:url parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传进度");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求成功%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"失败啦,哈哈%@", error);
}]; } #pragma mark - post请求2(当body中含有汉字或特殊字符的时候,这时候需要转码)
- (IBAction)postTwoRequestAction:(id)sender {
/* BODY: address = "";
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";
do = "add_comment";
kind = task;
"member_id" = zpHr2dsRvQQxYJxo2;
other = "";
"task_id" = 55a47e79ec25e3641;*/ NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSString *comment = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
//对汉字进行转码操作
comment = [comment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:@"" forKey:@"address"];
[dic setValue:comment forKey:@"comment"];
[dic setValue:@"add_comment" forKey:@"do"];
[dic setValue:@"task" forKey:@"kind"];
[dic setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
[dic setValue:@"" forKey:@"other"];
[dic setValue:@"55a47e79ec25e3641" forKey:@"task_id"]; //请求报文
[self.session POST:urlStr parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传进程%@", uploadProgress);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求成功%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败%@", error);
}]; //可以看到,在第三方库中,我们直接就可以调用GET和POST请求方法,不用像以前一样,写那么多行代码了,大大简化了代码量
}

GET和POST数据请求

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

上一篇:自学Linux Shell2.1-进入shell命令行


下一篇:学习笔记 C++ 类与对象