iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传
2016-11-13 16:56
1376 查看
AFNetworking
AFNetworking这个牛逼的框架相信大家都已经很了解了,这里就不班门弄斧了,这里主要是给新入门的同学介绍一下AFN的简单介绍,版本历史,框架结构和基本使用。AFNetworking的简单介绍以及版本历史
AFN的链接:GitHubAFN是iOS开发中一个非常牛逼的网络请求框架,根据它GitHbub上的介绍,AFN支持iOS,MAC OS ,watchOS以及tvOS 等等,各个历史版本以及支持的平台如下图
但是遗憾的是AFN并不支持Swift语言,不过AFN的作者又推出了swift版的AFN:Alamofire
框架,目前Alamofire框架已有10000+星,使用Swift开发的小伙伴可以使用该框架替代AFN。
根据作者介绍:
AFN1.x以及0.10x底层是NSURLConnection实现,在13年左右,2.0-2.6.3版本,AFN底层是由NSURLConnection和NSURLSession共同实现,在最新的3x版本,AFN放弃了NSURLConnection,单独由NSURLSession实现。
AFNetworking的框架结构
如图所示:AFN主要分三个部分1 NSURLSession:最新的AFN底层由NSURLSession实现,使用时主要使用以下两个管理者
AFURLSessionManager
AFHTTPSessionManager
2 Serialization:序列化相关,AFN牛逼之处就在于它帮我们完成序列化,不管是请求还是响应,都不用我们担心是使用JSON解析还是XML解析。
AFURLRequestSerialization:请求相关的序列化,很少用到。
AFURLResponseSerialization:响应相关的序列化,主要有三个:
AFHTTPResponseSerializer :对响应不做任何处理
AFJSONResponseSerializer :对响应进行JSON解析
AFXMLParserResponseSerializer :对响应进行XML解析
3 Additional Functionality:主要是网络安全如加密等等,以及网络状态监听相关的类。
AFNetworking的简单使用
1 GET请求
-(void)get { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON //这里不再把参数拼接到url里,AFN会自动帮我们把字典对象转换成JSON对象拼接到URL里。 NSDictionary *paramDict = @{ @"username":@"Cehae", @"pwd":@"Cehae", @"type":@"JSON" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager GET:@"http://120.25.226.186:32812/login" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@---%@",[responseObject class],responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; }
2 POST请求
-(void)post { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSDictionary *paramDict = @{ @"username":@"Cehae", @"pwd":@"Cehae", @"type":@"JSON" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager POST:@"http://120.25.226.186:32812/login" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@---%@",[responseObject class],responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; }
3 AFN文件下载
-(void)download { //1.创建会话管理者 AFHTTPSessionManager *manager =[AFHTTPSessionManager manager]; NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; //2.下载文件 /* 第一个参数:请求对象 第二个参数:progress 进度回调 downloadProgress 第三个参数:destination 回调(目标位置) 有返回值 targetPath:临时文件路径 response:响应头信息 第四个参数:completionHandler 下载完成之后的回调 filePath:最终的文件路径 */ NSURLSessionDownloadTask *download = [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] stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"targetPath:%@",targetPath); NSLog(@"fullPath:%@",fullPath); return [NSURL fileURLWithPath:fullPath]; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { NSLog(@"%@",filePath); }]; //3.执行Task [download resume]; }
4 重点 AFN文件/图片上传
-(void)upload2 { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // NSDictionary *dictM = @{} //2.发送post请求上传文件 /* 第一个参数:请求路径 第二个参数:字典(非文件参数) 第三个参数:constructingBodyWithBlock 处理要上传的文件数据 第四个参数:进度回调 第五个参数:成功回调 responseObject:响应体信息 第六个参数:失败回调 */ [manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { UIImage *image = [UIImage imageNamed:@"Snip20160227_128"]; NSData *imageData = UIImagePNGRepresentation(image); //使用formData来拼接数据 /* 第一个参数:二进制数据 要上传的文件参数 第二个参数:服务器规定的 第三个参数:该文件上传到服务器以什么名称保存 */ //[formData appendPartWithFileData:imageData name:@"file" fileName:@"xxxx.png" mimeType:@"image/png"]; //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/Cehae/Desktop/Snip20160227_128.png"] name:@"file" fileName:@"123.png" mimeType:@"image/png" error:nil]; [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/Cehae/Desktop/Snip20160227_128.png"] 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); }]; }
5 AFN网络状态监听
-(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; } }]; //3.开始监听 [manager startMonitoring]; }
6 AFN对请求结果数据进行 JSON解析 XML解析以及不做处理
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController ()<NSXMLParserDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self httpData2]; } //返回的是JSON数据 -(void)json { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON // NSDictionary *paramDict = @{ @"username":@"Cehae", @"pwd":@"Cehae", @"type":@"JSON" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第 c7bc 三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager GET:@"http://120.25.226.186:32812/login" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@---%@",[responseObject class],responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } //返回的是XML -(void)xml { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON // //注意:如果返回的是xml数据,那么应该修改AFN的解析方案 manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; NSDictionary *paramDict = @{ @"type":@"XML" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager GET:@"http://120.25.226.186:32812/video" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task,NSXMLParser *parser) { //NSLog(@"%@---%@",[responseObject class],responseObject); //NSXMLParser *parser =(NSXMLParser *)responseObject; //设置代理 parser.delegate = self; //开始解析 [parser parse]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } //返回的二进制数据 -(void)httpData { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //注意:如果返回的是xml数据,那么应该修改AFN的解析方案AFXMLParserResponseSerializer //注意:如果返回的数据既不是xml也不是json那么应该修改解析方案为: //manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //2.发送GET请求 [manager GET:@"http://120.25.226.186:32812/resources/images/minion_01.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) { NSLog(@"%@-",[responseObject class]); //UIImage *image = [UIImage imageWithData:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } -(void)httpData2 { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //注意:如果返回的是xml数据,那么应该修改AFN的解析方案AFXMLParserResponseSerializer //注意:如果返回的数据既不是xml也不是json那么应该修改解析方案为: //manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; //告诉AFN能够接受text/html类型的数据 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //2.发送GET请求 [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) { NSLog(@"%@-%@",[responseObject class],[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); //UIImage *image = [UIImage imageWithData:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } #pragma mark ---------------------- #pragma mark NSXMLParserDelegate -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { NSLog(@"%@--%@",elementName,attributeDict); }
相关文章推荐
- iOS开发-使用NSURLSession实现文件断点下载,文件离线续传以及图片上传
- iOS开发AFN使用二:AFN文件下载与文件上传
- Java:使用HttpClient进行POST和GET请求以及文件上传和下载
- 使用HttpClient进行POST和GET请求以及文件上传和下载
- Java:使用HttpClient进行POST和GET请求以及文件上传和下载
- Java:使用HttpClient进行POST和GET请求以及文件上传和下载
- PHP使用curl请求实现post方式上传图片文件功能示例
- HttpClient 4.5版本实现文件上传下载以及常用post、get请求
- iOS开发之结合asp.net webservice实现文件上传下载
- iOS开发之实现文件上传下载
- iOS开发 使用AFNetworking实现多张图片上传
- [iOS AFNetworking框架实现HTTP请求、多文件图片上传下载]
- iOS开发——网络篇——文件下载(NSMutableData、NSFileHandle、NSOutputStream)和上传、压缩和解压(三方框架ZipArchive),请求头和请求体格式,断点续传Range
- C#实现http协议支持上传下载文件的GET、POST请求
- C#实现http协议支持上传下载文件的GET、POST请求
- Volley请求HTTPS,及其实现post,delete,get,put,上传下载图片。demo
- iOS基础8:自定义MyData/自定义SQLite用于网络判断,版本判断,图片缓存处理,下载或者上传的GET或POST请求,加密手段,.数据解析
- iOS开发之结合asp.net webservice实现文件上传下载
- libcurl post/get上传下载文件 以及断点下载(操作libcurl 实现断点下载(续点续传))
- iOS开发之结合asp.net webservice实现文件上传下载(转)