第三方网络框架
AFNetworking
一款
轻量级网络请求
开源框架,基于iOS
和mac OS
网络进行扩展的高性能框架,大大降低了iOS开发工程师
处理网络请求的难度,让iOS开发变成一件愉快的事情。
-
AFNetworking优点
:
1.原有基础urlsesson上封装了一层,在传参方面更灵活,
2.回调更友好,
3.支持返回数据序列化
4.支持文件上传,断点下载,
5.自带多线程,防死锁
6.处理了Https证书流程,节省移动端开发
7.支持网络状态判断
-
AFNetWorking
发送POST
&GET
请求:
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (strong, nonatomic)AFHTTPSessionManager *manager;
@end
@implementation ViewController
- (AFHTTPSessionManager *)manager{
if (!_manager) {
_manager = [AFHTTPSessionManager manager];
}
return _manager;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self getData];
[self postData];
}
- (void)postData{
NSString *path = @"http://120.25.226.186:32812/login";
NSDictionary *parames=@{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
[self.manager POST:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:----%@-%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failuer:----%@",error);
}];
}
- (void)getData{
// AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/**
* 参数说明
*
* 第一个参数:请求的路径(NSString)不包含参数
* 第二个参数:需要传入的参数
* 第三个参数:附加到此请求的默认头的头
* 第四个参数:请求数据的进度
* 第五个参数:请求成功后的回调
* task:可以拿到响应头信息
responseObject:响应体信息 AFN内部默认对服务器返回数据进行json解析
*
* 第六个参数:请求失败后的回调
*
*/
NSString *path = @"http://120.25.226.186:32812/login";
NSDictionary *parames=@{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"JSON"
};
[self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:----%@-%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failuer:----%@",error);
}];
}
@end
-AFNetWorking
文件下载
&上传
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (strong, nonatomic)AFHTTPSessionManager *manager;
@end
@implementation ViewController
- (AFHTTPSessionManager *)manager{
if (!_manager) {
_manager = [AFHTTPSessionManager manager];
}
return _manager;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self downLoad];
[self upLoad];
}
//上传
- (void)upLoad{
NSString *urlPath = @"http://120.25.226.186:32812/upload";
NSDictionary *params = @{
@"username":@"aaaaa"
};
/**
* 参数说明
*
* 第一个参数:请求路径
* 第二个参数:非文件参数:oc的字典(NSDictionary)
* 第三个参数:constructingBodyWithBlock 处理要上传的文件参数的
* 第四个参数:progress进度的回调
* 第五个参数:success上传成功的回调
* task
* responseObject响应体信息(内部已经完成了JSON解析)
* 第六个参数:failure上传失败的回调
*
*/
[self.manager POST:urlPath parameters:params headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//id<AFMultipartFormData>协议:遵守这个协议就可以该协议中的方法
//处理要上传的文件
NSString *path = @"/Users/nana/Desktop/timg.jpeg";
NSURL *url = [NSURL fileURLWithPath:path];
//第一种方法
/**
* 参数说明
*
* 第一个参数:FileData:要上传文件的二进制数据
* 第二个参数:name:具体的数值 file
* 第三个参数:fileName:文件的名称
* 第四个参数:mimeType:文件的二进制数据类型
*
*/
// NSData *imageData = [NSData dataWithContentsOfFile:path];
// [formData appendPartWithFileData:imageData name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg"];
//第二种方法
/**
* 参数说明
*
* 第一个参数:FileURL:本地文件的URL路径
* 第二个参数:name:具体的数值 file
* 第三个参数:mimeType:文件的二进制数据类型
*
*/
// [formData appendPartWithFileURL:url name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg" error:nil];
//第三种方法
/**
* 参数说明
*
* 第一个参数:FileURL:本地文件的URL路径
* 第二个参数:name:具体的数值 file
*
*/
[formData appendPartWithFileURL:url name:@"file" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//计算进度信息
NSLog(@"进度信息:%f",1.0*uploadProgress.completedUnitCount/uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure:%@",error);
}];
}
//下载
- (void)downLoad{
NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591442074704&di=760001ecc8d2d0df7d98a8d6cc083bce&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F68%2F61%2F300000839764127060614318218_950.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
/**
* 参数说明
*
* 第一个参数:Request:请求对象
* 第二个参数:progress:进度回调
* 第三个参数:destination回调:需要在该回调中告诉方法应该把下载的文件保存到哪里
* targetPath:默认返回的临时存储路径(tmp)
* response:响应头信息
* 返回值:文件应该的存储路径
* 第四个参数:completionHandler:完成后的回调
*
*/
NSURLSessionDownloadTask *downLoadTask = [self.manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"下载进度:%f",1.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
}destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//拼接文件的存储路径给AFN,内部会自动的完成文件的剪切处理
NSLog(@"targetPath: %@",targetPath);
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = response.suggestedFilename;
NSString *fullPath = [cachesPath stringByAppendingPathComponent:fileName];
NSLog(@"fullPath:%@",fullPath);
return [NSURL fileURLWithPath:fullPath];
}completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//filePath:文件的路径(即上面回调的返回值)
NSLog(@"filePath:%@",filePath);
}];
[downLoadTask resume];
}
@end
-
AFNetworking
的Json
&Xml
解析
manager = [AFHTTPSessionManager manager];
manager:
内部默认
已经对服务器返回的数据
进行了JSON解析
操作AFJSONResponseSerializer
manager:
如果返回的数据是XML类型
:需要调整manager
对响应的解析方式:AFXMLParserResponseSerializer
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
manager:
如果返回的数据类型
既不是json
也不是xml
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()<NSXMLParserDelegate>
@property (strong, nonatomic)AFHTTPSessionManager *manager;
/**
* <#注释#>
*/
@property (strong, nonatomic)NSMutableArray *dataArray;
@end
@implementation ViewController
- (NSMutableArray *)dataArray{
if (!_dataArray) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}
- (AFHTTPSessionManager *)manager{
if (!_manager) {
_manager = [AFHTTPSessionManager manager];
//_manager:内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
//_manager:如果返回的数据是XML类型:需要调整manager对响应的解析方式:AFXMLParserResponseSerializer
// _manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//_manager:如果返回的数据类型既不是json也不是xml
_manager.responseSerializer = [AFHTTPResponseSerializer serializer];
}
return _manager;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self getJson];
// [self getXML];
// [self httpData];
}
- (void)httpData{
NSString *path = @"http://www.baidu.com";
NSDictionary *parames=nil;
[self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:----%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failuer:----%@",error);
}];
}
- (void)getXML{
NSString *path = @"http://120.25.226.186:32812/video";
NSDictionary *parames=@{
@"type":@"XML"
};
[self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:----%@-%@",[responseObject class],responseObject);
//使用NSXMLParser解析数据
//01 创建解析器
NSXMLParser *parser = (NSXMLParser *)responseObject;
//02 设置代理
parser.delegate = self;
//03 开始解析
[parser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failuer:----%@",error);
}];
}
- (void)getJson{
NSString *path = @"http://120.25.226.186:32812/video";
NSDictionary *parames=@{
@"type":@"JSON"
};
//内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
[self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success:----%@-%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failuer:----%@",error);
}];
}
#pragma---------------------------------------
#pragma MARK - NSXMLParserDelegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
NSLog(@"%@ - \n -%@",elementName,attributeDict);
[self.dataArray addObject:attributeDict];
}
@end
-
AFNetworking
网络状态监听
- (void)netStateType{
//01 创建网络监听管理者对象
AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager manager];
//02 监听
[netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//当监听网络装调改变的时候,就会调用block,并且把当前的网络状态作为参数传递给block
/**
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
*/
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知的网络状态");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WiFi网络");
break;
default:
break;
}
}];
//03 开始监听
[netManager startMonitoring];
}