iOS开发--AFN框架基本使用
iOS开发--AFN框架基本使用
技术概述
AFNetworking是目前国内开发网络应用使用最多的第三方框架,专为 Mac OS & iOS 设计的一套网络框架,对 NSURLConnection 和 NSURLSession 做了封装,提供有丰富的 API,同时提供了完善的错误解决方案,使用简单。
技术详述
使用案例
我在此次团队开发项目中使用AFNetworking请求后端接口,给后端发送数据,图片文件。
例如访问新增日记的接口:
步骤
1.创建会话管理者manager
2.发送POST/GET请求
第一个参数:请求路径(不包含参数).NSString
第二个参数:字典(发送给服务器的数据~参数)
第三个参数:constructingBodyWithBlock 处理要上传的文件数据
第四个参数:progress 进度回调
第五个参数:success 成功回调
responseObject:响应体信息(JSON--->OC对象)
第六个参数:failure 失败回调
error:错误信息
数据格式
- 请求数据格式:AFURLRequestSerialization
类型 | 说明 |
---|---|
AFHTTPRequestSerializer | 二进制的,默认的 |
AFJSONRequestSerializer | JSON(POST JSON) RESTful 设计风格需要 |
AFPropertyListRequestSerializer | PList(POST Plist-开发中几乎不用) |
- 响应数据格式:AFURLResponseSerialization
类型 | 说明 |
---|---|
AFHTTPResponseSerializer | HTTP 二进制的 |
AFJSONResponseSerializer | JSON 默认的 |
AFXMLParserResponseSerializer | XML Parser 解析器 SAX 解析 |
常见功能
-
发送GET/POST请求
NSDictionary *dic1=@{ @"phone":_phone, @"username":alert.textFields[0].text }; AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager]; manager1.requestSerializer = [AFJSONRequestSerializer serializer]; manager1.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager1 POST:@"http://localhost:8080/OneDay/user/username" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@",responseObject); [[NSUserDefaults standardUserDefaults] setObject:alert.textFields[0].text forKey:@"username"]; _username=alert.textFields[0].text; [[NSUserDefaults standardUserDefaults] synchronize]; [self.tableview reloadData]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSError *err=error; NSLog(@"%@",err); UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"提示" message:@"修改昵称失败" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; }];
-
下载/上传文件
上传图片:
AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:@"http://localhost:8080/OneDay/user/profilePhoto" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
{
NSData *data1=[_phone dataUsingEncoding:NSUTF8StringEncoding];
[formData appendPartWithFormData:data1 name:@"phone"];
NSData *data=UIImageJPEGRepresentation(image, 0.7);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.jpg", str];
//上传文件参数
[formData appendPartWithFileData:data name:@"photo" fileName:fileName mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//打印上传进度
CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
NSLog(@"%.2lf%%", progress);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//成功之后修改phone
NSDictionary *dic1=@{
@"phone":_phone,
@"password":_password,
};
AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager];
manager1.requestSerializer = [AFJSONRequestSerializer serializer];
manager1.responseSerializer = [AFJSONResponseSerializer serializer];
[manager1 POST:@"http://localhost:8080/OneDay/user/login" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *nsdic=responseObject;
NSLog(@"%@",nsdic);
[[NSUserDefaults standardUserDefaults] setObject:[nsdic objectForKey:@"photo"] forKey:@"photo"];
[[NSUserDefaults standardUserDefaults] synchronize];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSError *err=error;
NSLog(@"%@",err);
}];
NSLog(@"请求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//请求失败
NSLog(@"请求失败:%@",error);
}];
附加功能
- 安全策略
- HTTPS
- AFSecurityPolicy
- 网络检测
- 对苹果的网络连接检测做了一个封装
- AFNetworkReachabilityManager
//创建一个单例manager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//监测网络状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"连接到路由器网络不能到达");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//开启检测
[manager startMonitoring];
技术使用中遇到的问题
- 3840报错
- 1016报错
在进行网络请求时出现-1016 是因为只支持text/json,application/json,text/javascript你可以添加text/html或其他
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",nil];
总结
AFNetworking是iOS开发中常使用的框架,一个构建在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架,主要使用在发送网络请求以及实时监测网络状态的两个场景中,对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使用起来非常轻松,post和get请求管理类定义api完全相同。