什么是AFN
-
全称是AFNetworking,是对NSURLSession的一层封装
-
运行效率没有ASI高,但是使用比ASI简单
-
在iOS开发中,使用比较广泛
-
AFN的github地址
AFHTTPSessionManager
- AFHTTPSessionManager
- 是AFN中最重要的对象之一
- 封装了HTTP请求的常见处理
- GET\POST请求
- 解析服务器的响应数据
- 创建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
AFNetworking发送GET请求
// 1. 创建 会话管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 2. 发送GET 请求
/*
第一参数: 请求路径(不包含参数)NSString类型
第二参数: 请求参数 字典的形势发送(发送给服务器的数据~参数)
第三参数: progress 进度回调
第四参数: success 成功回调
task: 请求任务
responseObject: 响应体信息(JSON ---> OC对象)
第五参数: failure 失败回调
task: 请求任务
error: 错误信息
响应头: task.response
*/
[manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败---- %@",error);
}];
AFNetworking 发送POST请求
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 发送POST请求
/*
第一参数: 请求路径(不包含参数)NSString类型
第二参数: 请求参数 字典的形势发送(发送给服务器的数据~参数)
第三参数: progress 进度回调
第四参数: success 成功回调
task: 请求任务
responseObject: 响应体信息(JSON ---> OC对象)
第五参数: failure 失败回调
task: 请求任务
error: 错误信息
响应头: task.response
*/
[manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败---- %@",error);
}];
- AFNetworking GET请求和POST请求的具体代码如下:
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"点击" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
// [self getAFNetworking];
[self postAFNetworking];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
-(void)getAFNetworking
{
// 1. 创建 会话管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 2. 发送GET 请求
/*
第一参数: 请求路径(不包含参数)NSString类型
第二参数: 请求参数 字典的形势发送(发送给服务器的数据~参数)
第三参数: progress 进度回调
第四参数: success 成功回调
task: 请求任务
responseObject: 响应体信息(JSON ---> OC对象)
第五参数: failure 失败回调
task: 请求任务
error: 错误信息
响应头: task.response
*/
[manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败---- %@",error);
}];
}
-(void)postAFNetworking
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parametersDic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
// 发送POST请求
/*
第一参数: 请求路径(不包含参数)NSString类型
第二参数: 请求参数 字典的形势发送(发送给服务器的数据~参数)
第三参数: progress 进度回调
第四参数: success 成功回调
task: 请求任务
responseObject: 响应体信息(JSON ---> OC对象)
第五参数: failure 失败回调
task: 请求任务
error: 错误信息
响应头: task.response
*/
[manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--------%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败---- %@",error);
}];
}
@end
AFNetworking实现文件下载
不多说了,直接上代码,操作简单明了
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"点击" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
[self getAFNetworking];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
-(void)getAFNetworking
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_03.mp4"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
// 下载文件
/*
第一参数: 请求对象
第二参数: progress 进度回调 downloadProgress
第三参数: destination 回调(目标位置)
有返回值
targetPath: 临时文件路径
response: 响应头信息
第四参数: completionHandler 下载完成之后的回调
response: 响应头信息
filePath: 最终的文件路径
error: 错误信息
*/
NSURLSessionDownloadTask * downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// 监听下载进度
// completedUnitCount 已经下载的数据大小
// totalUnitCount 文件数据的总大小
NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString * fullPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
fullPath = [fullPath stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"临时路径:%@",targetPath);
NSLog(@"缓存路径:%@",fullPath);
return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"%@",filePath);
}];
// 3. 执行task
[downloadTask resume];
}
AFNetworking实现文件上传
上传也不多说,以后在慢慢解释各个参数
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
// 设置boundary的宏
#define Kboundary @"----WebKitFormBoundaryaItGoVAfuLHDoRD4"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"点击" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
// [self upload];
[self upload2];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
// 不推荐
-(void)upload
{
// 1. 创建会话管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 2. 确定URL
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
// 2.1 创建请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
// 2.2 设置请求方法
request.HTTPMethod = @"POST";
// 2.3 设置请求头信息
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
// 3. 发送请求上传文件
/*
第一参数: 请求对象
第二参数: fromData 二进制数据 传递要上传的数据(请求体)
第三参数: progress 进度信息
第四参数: completionHandler 下载完成后的回调
*/
NSURLSessionUploadTask * uploadTask = [manager uploadTaskWithRequest:request fromData:[self getBodyData] progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传进度:%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
NSLog(@"%@",responseObject);
}];
// 执行Task
[uploadTask resume];
}
-(void)upload2
{
// 1. 创建会话管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * dicM = @{
@"username":@"456123",
};
// 2. 发送post请求上传文件
/*
第一参数: 请求路径
第二参数: 字典(非文件参数)
第三参数: constructingBodyWithBlock 处理要上传的文件数据
第四参数: progress 进度回调
第五参数: success 成功回调 responseObject: 响应体信息
第六参数: failure 失败回调 error: 错误信息
*/
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dicM constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
UIImage * image = [UIImage imageNamed:@"静态05"];
NSData * imageData = UIImageJPEGRepresentation(image, 0.8);
// 使用formData 来拼接数据
/*
第一参数: 二进制数据 要上传的文件参数
第二参数: 服务器规定的
第三参数: 该文件上传到服务器以什么名称保存
第四参数: mimeType
*/
// [formData appendPartWithFileData:imageData name:@"file" fileName:@"允儿" mimeType:@"image/jepg"];
// 方法二
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" fileName:@"播放" mimeType:@"image/jepg" error:nil];
// 方法三
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"上传进度:%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功------%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"上传失败------%@",error);
}];
}
-(NSData *)getBodyData
{
NSMutableData * fileData = [NSMutableData data];
// 5.1 文件参数
/*
--分隔符
Content-Disposition: form-data; name="file"; filename="静态05.jpg"
Content-Type: image/jpeg(MIMEType:大类型/小类型)
空行
文件参数
*/
NSData * oneData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:oneData];
// 把换行添加进请求体数据中
[fileData appendData:KNewLine];
// name:file 服务器规定的参数
// filename: 静态05.jpg 文件保存到服务器上面的名称
// Content-Type: 文件的类型
NSData * twoData = [@"Content-Disposition: form-data; name=\"file\"; filename=\"静态05.jpg\"" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:twoData];
[fileData appendData:KNewLine];
NSData * thirdlyData = [@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:thirdlyData];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine];
UIImage * image = [UIImage imageNamed:@"静态05"];
// UIImage --> NSData
NSData * imageData = UIImageJPEGRepresentation(image, 0.5);
[fileData appendData:imageData];
[fileData appendData:KNewLine];
// 5.2 非文件参数
/*
--分隔符
Content-Disposition: form-data; name="username"
空行
456123
*/
NSData * sixthData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:sixthData];
[fileData appendData:KNewLine];
NSData * seventhData = [@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:seventhData];
[fileData appendData:KNewLine];
[fileData appendData:KNewLine];
NSData * ninthData = [@"456123" dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:ninthData];
[fileData appendData:KNewLine];
// 5.3 结尾标识
NSData * tenthData = [[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[fileData appendData:tenthData];
return fileData;
}
@end
监控联网状态
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%d", status);
}];
具体代码如下:
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property(nonatomic,strong) UIButton * btn;
@end
@implementation ViewController
-(UIButton *)btn
{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
[_btn setTitle:@"点击" forState:UIControlStateNormal];
[_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
-(void)clickBtn:(UIButton *)btn
{
[self AFN];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.btn];
}
- (void)AFN
{
// 1. 获得一个网络状态监测管理者
AFNetworkReachabilityManager * manager = [AFNetworkReachabilityManager sharedManager];
// 2. 监听状态的改变
/*
AFNetworkReachabilityStatusUnknown = -1, 未知
AFNetworkReachabilityStatusNotReachable = 0, 没有网络
AFNetworkReachabilityStatusReachableViaWWAN = 1, 蜂窝网络
AFNetworkReachabilityStatusReachableViaWiFi = 2, Wifi
*/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"Wifi");
break;
case AFNetworkReachabilityStatusNotReachable :
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知错误");
break;
default:
break;
}
}];
// 开始监听
[manager startMonitoring];
}
@end
- 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
网友评论