iOS开发中一般情况下,简单地向某个Web站点简单的页面提交请求并获取服务器的响应,用Xcode自带的API就能胜任。但是在数据处理(如下载等)需要自己实现。代码量较大,难以管理,此时可以选择使用第三方网络库。常用的有AFNetworking、ASIHTTPRequest、MKNetworkKit、RestKit等
下面介绍AFNetworking
AFNetworking是一个能够快速使用的iOS和Mac OS X 下的网络框架,它构建在Foundation URL Loading System之上,封装了网络的抽象层,可以方便的使用,AFNetworking是一个模块化架构,拥有丰富的API框架。AFNetworking是目前使用人数最多的第三方框架网络库。
下面将使用AFNetworking中基于NSURLSession API支持封装的接口进行介绍。
AFNetworking重要组成部分:
AFURLSessionManager:创建、管理基于NSURLSessionConfiguration对象的NSURLSession对象的类,也可以管理session的数据、下载/上传任务,实现session和其相关联的任务的delegate方法。因为NSURLSession API设计中的不足,任何和NSURLSession相关的代码都可以用AFURLSessionManager改善;
AFHTTPSessionManager:是AFURLSessionManager的子类,包装常见的HTTP web服务操作,通过AFURLSessionManager 由NSURLSession支持。例如:GET、POST、HEAD、PUT等;
<AFURLRequestSerializer>:符合这个协议的对象用于处理请求,它将请求参数转换为query string 或是 entity body 的形式,并设置必要的header;
<AFURLResponseSerializer>:符合这个协议的对象用于验证、序列化响应及相关数据,转换为有用的形式,比如JSON对象、图像、甚至基于Mantle的模型对象;
AFSecurityPolicy:评估服务器对安全连接针对指定的固定证书或公共密钥的信任,将你的服务器证书添加到app bundle,以帮助防止其他人的攻击;
AFNetworkReachabilityManager-这个类监控当前网络的可达性,提供回调block和notification,在可达性变化时调用。
使用AFNetworking做GET请求:
////做get请求/////////
NSString *urlString = @"https://api.weibo.com/2/statuses/public_timeline.json";
NSDictionary *parameters = @{@"access_token":@"2.00PogMQGGQ5O2E3633c3a534p58DVB"};
//1.创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.设置请求参数的拼接
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//3.设置接受的响应数据类型
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//做get请求
[manager GET:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject is:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error is:%@",error);
}];
使用AFNetworking做POST请求:
//1.创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.设置请求参数的拼接
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//3.设置接受的响应数据类型
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//做简单的post请求
NSString *postUrlString = @"https://api.weibo.com/2/statuses/update.json";
NSDictionary *postDic = @{@"access_token":@"2.00PogMQGGQ5O2E3633c3a534p58DVB",@"status":@"hehehe"};
///post上传文本////////
[manager POST:postUrlString parameters:postDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error is:%@",error);
}];
//POST上传图片:
NSString *postImgUrlString = @"https://upload.api.weibo.com/2/statuses/upload.json";
NSDictionary *dic = @{@"access_token":@"2.00PogMQGGQ5O2E3633c3a534p58DVB",@"status":@"嘿嘿嘿、、"};
[manager POST:postImgUrlString parameters:dic constructingBodyWithBlock:^(id<</span>AFMultipartFormData> _Nonnull formData) {
//将图片转化为data数据
NSString *imgPath = [[NSBundle mainBundle] pathForResource:@"img" ofType:@"png"];
NSData *imgData = [NSData dataWithContentsOfFile:imgPath];
//将图片数据拼接form表单中
[formData appendPartWithFileData:imgData name:@"pic" fileName:@"img.png" mimeType:@"image/png"];
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"上传成功");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error is:%@",error);
}];
}
-使用AFNetworking做download请求:
/////执行download下载.//////
AFURLSessionManager *urlManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURL *url = [NSURL URLWithString:@"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4"];
//创建request请求
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
//创建下载任务
NSURLSessionDownloadTask *task = [urlManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"progress is:%@",downloadProgress);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//返回数据存储的文件路径 下载完成后数据文件将自动拷贝到该文件下
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/123.mp4"];
//将字符串转化为文件路径 注意一定要使用fileURLWithPath:该方法
return [NSURL fileURLWithPath:filePath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
if (error) {
NSLog(@"error is:%@",error);
}
NSLog(@"filePath is:%@",[NSString stringWithFormat:@"%@",filePath]);
}];
//执行任务
[task resume];