A.AFN基本知识
1.概念
- AFNetworking
- 是对NSURLConnection的封装
- 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单
- AFN支持ARC
B.基本请求使用
1.基本使用
(1)头文件 AFNetworking.h
(2)管理者类:AFHTTPRequestOperationManager
(3)“GET”方法发送GET请求,使用“POST”方法发送POST请求
(4)使用字典发送参数
(5)block处理请求成功/失败
1
/*
* 发送 GET/POST 请求
*/
2 - (void) sendNormalRequest {
3// 1.创建请求 管理者 4 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
5 6// 2.设置参数 7 NSMutableDictionary *param = [NSMutableDictionary dictionary];
8 param[@"user"] = @"tom";
9 param[@"password"] = @"123";
1011// 3.发送请求
12//// 3.1 GET请求
13// [manager GET:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
14// NSLog(@"请求成功");
15// NSLog(@"%@", responseObject);
16// } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
17// NSLog(@"请求失败");
18// NSLog(@"%@", error);
19// }];
2021// 3.2 POST请求22 [manager POST:@"http://192.168.0.21:8080/MyTestServer/login" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
23 NSLog(@"请求成功");
24 NSLog(@"%@", responseObject);
25 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
26 NSLog(@"请求失败");
27 NSLog(@"%@", error);
28 }];
29 }
2.为了方便查看服务器返回的中文数据,给数组和字典增加一个分类,支持中文
1
#import <Foundation/Foundation.h>
2 3@implementation NSDictionary (Log)
4 5/** 本地化显示 */ 6 - (NSString *)descriptionWithLocale:(id)locale {
7 NSMutableString *str = [NSMutableString string];
8 9 [str appendString:@"{n"];
1011// 遍历字典12 [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
13 [str appendFormat:@"t%@ = %@,n", key, obj];
14 }];
1516 [str appendString:@"}"];
1718// 取出最后一个“,”19 NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
20 [str deleteCharactersInRange:range];
2122return str;
23}
2425@end2627@implementation NSArray (Log)
2829 - (NSString *)descriptionWithLocale:(id)locale {
30 NSMutableString *str = [NSMutableString string];
3132 [str appendString:@"[n"];
3334// 遍历数组所有元素35 [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
36 [str appendFormat:@"%@, n", obj];
37 }];
3839 [str appendString:@"]"];
4041return str;
42}
4344@end
3.解析返回的json数据
- AFHTTPRequestOperationManager 依靠设置序列化器来自动识别、解析返回的数据
- 默认使用的就是json解析,可以不用设置序列化器
- 会把json自动转换成为字典或者数组输出
1
/*
* 返回json数据
*/
2 - (void) getJson {
3// 1.创建请求 管理者 4 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
5 6// 设置序列化器
7// [manager setResponseSerializer:[AFJSONResponseSerializer serializer]];//默认
8 9// 2.设置参数10 NSMutableDictionary *param = [NSMutableDictionary dictionary];
11 param[@"type"] = @"json";
1213// 3.发送请求14 [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
15 NSLog(@"请求成功");
16 NSLog(@"返回的数据类型是:%@", [responseObject class]);
17 NSLog(@"%@", responseObject);
18 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
19 NSLog(@"请求失败");
20 NSLog(@"%@", error);
21 }];
22 }
output:
2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 请求成功
2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 返回的数据类型是:__NSCFDictionary
2015-01-30 03:34:14.818 AFNBasicDemo[1889:192783] {
videos = [
{
name = 驯龙高手1,
video = videos/1.MP4,
length = 16秒,
image = images/[20150124-180852-0].PNG
2015-01-30 03:34:14.817 AFNBasicDemo[1889:192783] 返回的数据类型是:__NSCFDictionary
2015-01-30 03:34:14.818 AFNBasicDemo[1889:192783] {
videos = [
{
name = 驯龙高手1,
video = videos/1.MP4,
length = 16秒,
image = images/[20150124-180852-0].PNG
},
...
4.解析返回的xml数据
设置使用xml序列化器,也可以自动将xml数据转换成为字典或者数组
如果不设置xml序列化器,处理返回数据会失败
1
/*
* 返回xml数据
*/
2 - (void) getXml{
3// 1.创建请求 管理者 4 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
5 6// 设置序列化器 7 [manager setResponseSerializer:[AFXMLParserResponseSerializer serializer]];
8 9// 2.设置参数10 NSMutableDictionary *param = [NSMutableDictionary dictionary];
11 param[@"type"] = @"xml";
121314// 3.发送请求15 __weak typeof(self) vc = self;
16 [manager GET:@"http://192.168.0.21:8080/MyTestServer/video" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
17 NSLog(@"请求成功");
18 NSLog(@"返回的数据类型是:%@", [responseObject class]);
1920 NSXMLParser *parser = (NSXMLParser *) responseObject;
21 parser.delegate = vc;
22 [parser parse];
23 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
24 NSLog(@"请求失败");
25 NSLog(@"%@", error);
26 }];
27 }
C.文件下载/上传
1.文件下载
- 也是简单发送请求
- 但是没有ASI那样的监听功能
1 - (void) downloadFile {
2// 1.创建请求管理者 3 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
4 5// 设置序列化器 6 [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; // 使用二进制数据序列化
7 8// 3.发送请求 9 [manager GET:@"http://192.168.0.21:8080/MyTestServer/images/images.zip" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
1011 NSLog(@"请求成功");
12 NSLog(@"返回的数据类型是:%@", [responseObject class]);
1314 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
15 NSString *filePath = [cachePath stringByAppendingPathComponent:@"download.zip"];
16 NSData *data = (NSData *) responseObject;
17 [data writeToFile:filePath atomically:YES];
1819 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
20 NSLog(@"请求失败");
21 NSLog(@"%@", error);
22 }];
23 }
2.文件上传
- 使用POST请求,带formData的post方法
- 要区分普通参数和文件参数,把文件数据放在普通参数中上传是不行的
- 文件放在block参数中赋值
(1)把文件转换成二进制数据
(2)拼接文件参数
1
/*
* 上传文件
*/
2 - (void) uploadFile {
3// 1.创建请求管理者 4 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
5 6// 2.设置参数 7 NSMutableDictionary *param = [NSMutableDictionary dictionary];
8 param[@"user"] = @"uploader";
910// 3.设置上传文件11 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"M2.jpg" ofType:nil];
12 NSData *fileData = [NSData dataWithContentsOfFile:filePath];
1314// 4.上传文件15 __weak typeof(fileData) uploadData = fileData;
1617 [manager POST:@"http://192.168.0.21:8080/MyTestServer/upload" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
1819// 拼接文件数据20 [formData appendPartWithFileData:uploadData name:@"uploadedFile" fileName:@"my_pic.jpg" mimeType:@"image/jpg"];
2122 } success:^(AFHTTPRequestOperation *operation, id responseObject) {
23 NSLog(@"上传成功 ---- %@", responseObject);
24 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
25 NSLog(@"上传失败 ---- %@", error);
26 }];
27 }
D.网络状态监控
AFNetworkReachabilityManager
(1)创建网络监控管理者
(2)设置监控网络状态变化
(3)开启监控
(4)也可以主动去获取网络状态
1 - (IBAction)monitorNetwork:(UIButton *)sender {
2// 1.创建网络状态监控管理者 3 AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
4 5// 2.网络状态改变事件(被动检测) 6 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
7switch (status) {
8case AFNetworkReachabilityStatusUnknown:
9 NSLog(@"转换为未知网络");
10break;
11case AFNetworkReachabilityStatusReachableViaWWAN:
12 NSLog(@"转换为手机网络");
13break;
14case AFNetworkReachabilityStatusReachableViaWiFi:
15 NSLog(@"转换为WIFI网络");
16break;
17case AFNetworkReachabilityStatusNotReachable:
18 NSLog(@"转换为没有网络");
19break;
2021default:
22break;
23 }
24 }];
2526// 开启监控27 [manager startMonitoring];
2829// 主动检测30if ([manager isReachable]) {
31 NSLog(@"现在有网络");
32 } elseif ([manager isReachableViaWiFi]) {
33 NSLog(@"现在是通过wifi上网");
34 } elseif ([manager isReachableViaWWAN]) {
35 NSLog(@"现在是通过手机网络上网");
36 } else {
37 NSLog(@"现在没有网络");
38 }
39 }
原文:http://www.cnblogs.com/hellovoidworld/p/4262819.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!