AFN
- 我们在日常开发中,经常使用到网络请求,之前已经简单的说过,网络的概念和请求数据和下载文件
- 但是在日常开发中,我们一般会使用到
AFNetworking
这个框架,请求数据,上传数据,下载数据文件
简单的get和post数据请求
get
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/*
参数一:需要请求的 e网址字符串
参数二:参数
参数三: 请求头的设置
参数四:下载进度
*/
[manager GET:@"http://localhost/iOS/demo.json" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"errir:----%@",error);
}];
POST
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:@"网址" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
文件下载
参数一: 请求对象
参数二:NSProgress
下载进度completedUnitCount
下载的大小totalUnitCount
文件的总大小
参数三: block回调,需要返回一个 存储下载文件的URL地址
参数四: 下载完成时,返回下载文件的地址,就是 参数三 你传的地址
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost/video.mp4"]];
//返回一个下载任务对象
NSURLSessionDownloadTask *loadTask = [manager downloadTaskWithRequest:requset progress:^(NSProgress * _Nonnull downloadProgress) {
// completedUnitCount 下载的大小
// totalUnitCount文件的总大小
NSLog(@"%lld----%lld",downloadProgress.completedUnitCount,downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString *fullPath =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingString:response.suggestedFilename];
NSLog(@"targetPath-:%@---fullPath:-%@",targetPath,fullPath);
//这个block 需要返回一个目标 地址 存储下载的文件
return [NSURL fileURLWithPath:fullPath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"下载完成地址:%@",filePath);
}];
//启动下载任务--开始下载
[loadTask resume];
文件上传
方式一
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost"]];
UIImage *image = [UIImage imageNamed:@"pic.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:requset fromData:imageData progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"%lld",uploadProgress.completedUnitCount);
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
NSLog(@"error:%@",error.description);
NSLog(@"%@",responseObject);
}];
[uploadTask resume];
方式二
- 这种方式比较简单,
post
请求
在上传数据的时候 里面有多重方式
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//上传数据
[manager POST:@"http://localhost" parameters:nil headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//上传数据 方式1
UIImage *image = [UIImage imageNamed:@"pic.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 0.7);
//要上传的数据 和 上传数据服务器对应的名称
[formData appendPartWithFormData:imageData name:@"file"];
/*
方式2
FileData要上传的数据
name 服务器规定
fileName 上传文件的名称
mimeType类型
*/
[formData appendPartWithFileData:imageData name:@"file" fileName:@"100.jpg" mimeType:@"image/jpg"];
//本地文件的路径 方式3
NSURL *url = [NSURL fileURLWithPath:@"路径"];
[formData appendPartWithFileURL:url name:@"file" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//上传进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//上传成功的回调
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//上传失败的回调
}];
AFN的一些序列化
解析XML数据`
- 接收到
XML
数据的时候,responseObject
响应的数据类型是NSXMLParser
可以参考XML数据解析
//如果返回数据是XML的时候 记得序列化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置响应的方式是XML
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
[manager GET:@"loacst" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//如果是XML数据 responseObject对应的是NSXMLParser
NSXMLParser *parser = (NSXMLParser *)responseObject;
//进行解析
parser.delegate = self;
//解析数据
[parser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
数据既不是XML也不是JSON
- 修改响应的方式为
原生的
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置响应的方式
manager.responseSerializer =[AFHTTPResponseSerializer serializer];
- 在请求不是AFN规定机械方式的时候 还是错出现一些问题的 比如:
text/html
的格式 报错码是 Code=-1016, content-type:text/html
- 默认的解析方式如下
//如果返回数据是XML的时候 记得序列化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//修改响应解析 的类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/json" nil];
网络状态的检测AFNetworkReachabilityManager
//创建管理对象
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//网络的状态
/*
//未知状态
AFNetworkReachabilityStatusUnknown = -1,
//没有网络
AFNetworkReachabilityStatusNotReachable = 0,
//蜂窝
AFNetworkReachabilityStatusReachableViaWWAN = 1,
//wifi
AFNetworkReachabilityStatusReachableViaWiFi = 2,
*/
NSLog(@"------%zd",status);
}];
//开始监听
[manager startMonitoring];