AFNetworking 实际上是对 NSURLSession高度封装,并且AFNetworking为我们提供了一些更加简单易用的方法,方便我们在开发中发送网络请求后获取到相应的响应数据,并在此基础上构建项目的网络组件。
一、AFN优点:
1.原有基础urlsesson上封装了一层,在传参方面更灵活,
2.回调更友好,
3.支持返回数据序列化
4.支持文件上传,断点下载,
5.自带多线程,防死锁
6.处理了Https证书流程,节省移动端开发
7.支持网络状态判断
二、为什么要用AFNetworking
在iOS开发中,一般情况下,简单的向某个web站点简单的页面提交请求并获取服务器的响应,用xcode自带的NSURLConnection是能胜任的。但是,在绝大部分下我们所需要访问的web页面则是属于那种受到权限保护的页面,并不是有一个简单的URL可以访问的。这就涉及到了Session和Cookie的处理了,在此时使用NSURLConnection也是能够达到要求的,只是其中处理起来的复杂度和难度就提升了。
为了更好的处理向Web站点的请求,包括处理Session,Cookie等细节问题,使用AFNetworking则是更好的选择,他可以用于发送HTTP请求,接收HTTP的响应,但是不会缓存服务器的响应,不能执行HTML页面中的JAvascript代码,同时,AFNetworking还内置支持json,plist文件和XML文件的解析,使用比较方便。
扩展:1、Session:中文有译作时域的,就是只某个客户端在访问服务器起到停止访问这一段的时间间隔被称为时域。
2、Cookie:由服务器发送给客服端,把Cookie的key:value值储存在本地文件夹下,当下次请求的时候能够直接发送Cookie获得权限验证
三、FNetworking 网络请求使用
1.AFHTTPSessionManager
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@";]]; [manager GET:@"/open/api/weather; parameters:@{@"city":@"北京"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"%@", error); }];2.AFURLSessionManager
`AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionconfiguration` object, which conforms to `<NSURLSessionTaskDelegate>`, `<NSURLSessionDataDelegate>`, `<NSURLSessionDownloadDelegate>`, and `<NSURLSessionDelegate>`.1.负责创建和管理NSURLSession
2.管理NSURLSessionTask
3.实现NSURLSession中各种代理协议
4.引入AFSecurityPolicy保证请求的安全
5.引入AFNetworkingReachabilityManager监控网络状态
四、AFNetworking 整体框架
五、总结AFNetworking的用法
1、提交GET请求和提交POST请求
AFNetworking是第三方的框架,所以需要开发者自行下载,安装。并在AFNe文件导入#import“AFHTTPreque ”,把AFNe头文件放入prefix文件中。
a、创建AFHTTPRequestOpeartionManger对象
b、根据服务器内容的不同,为AFHTTPRequestOpeartionManger对象指定不同的解析器,该对象默认的解析器是JSON和Plist文件解析器。如果服务器的数据是XML格式则需要手动的更改解析器
c、发送GET请求:用Manager对象调用GET:parameters:success:failure:方法即可,success代码块和failue代码块在网络请求成功/失败过后调用。
d、success:参数指定了代码块中处理服务器响应成功的正确数据,failue:参数指定了代码块中处理服务器响应失败的错误数据、
AFHTTPRquestOperationManager
包含了常见的HTTP访问web站点的模式,有创建请求,连续的响应,网络类型监视以及安全。
“GET”:
[objc]view plaincopy <spanstyle="font-size:12px;">//创建AFHTTPRequestOperationManager对象AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationMangermanager];//调用get方法[managerGET:@“[]()”parameters:parameters//加载成功的代码块,可以接收数据success:^(AFHTTPRequestOperation*operation,idresponseobject)]{ NSLog(@“json“:%@”,responseObject); }failure:^(AFHTTPRequestOperation*operation,NSError*error){ NSLog(@“Error:%@”,error); }];</span>”POST“:URL-Form-Encoded Request URL编码请求类型 [objc]view plaincopy AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManagermanager]; NSDictionary*parameters=@{@"foo":@"bar"}; [managerPOST:@"[]()"parameters:parameterssuccess:^(AFHTTPRequestOperation*operation,idresponseObject){ NSLog(@"JSON:%@",responseObject); }failure:^(AFHTTPRequestOperation*operation,NSError*error){ NSLog(@"Error:%@",error); }];"POST"多个请求 [objc] view plaincopy AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManagermanager];NSDictionary*parameters=@{@"foo":@"bar"};NSURL*filePath=[NSURLfileURLWithPath:@"file://path/to/image.png"]; [managerPOST:@"[]()"parameters:parametersconstructingBodyWithBlock:^(id<AFMultipartFormData>formData){ [formDataappendPartWithFileURL:filePathname:@"image"error:nil]; }success:^(AFHTTPRequestOperation*operation,idresponseObject){NSLog(@"Success:%@",responseObject); }failure:^(AFHTTPRequestOperation*operation,NSError*error){NSLog(@"Error:%@",error); }];2、创建一个下载文件的任务
AFURLSessionManager创建并完善了一个NSURLSession的对象基于遵从NSURLSessionDelegate与NSURLSessionDataDelegate协议NSURLSessionConfigration对象。
[objc]view plaincopyNSURLSessionConfiguration*configuration=[NSURLSessionConfigurationdefaultSessionConfiguration]; AFURLSessionManager*manager=[AFURLSessionManageralloc]initWithSessionConfiguration:configuration];NSURL*URL=[NSURLURLWithString:@"[]()"];NSURLRequest*request=[NSURLRequestrequestWithURL:URL];NSURLSessionDownloadTask*downloadTask=[managerdownloadTaskWithRequest:requestprogress:nildestination:^NSURL*(NSURL*targetPath,NSURLResponse*response){NSURL*documentsDirectoryURL=[NSFileManagerdefaultManager]URLForDirectory:NSDocumentDirectoryinDomain:NSUserDomainMaskappropriateForURL:nilcreate:NOerror:nil];return[documentsDirectoryURLURLByAppendingPathComponent:[responsesuggestedFilename]; }completionHandler:^(NSURLResponse*response,NSURL*filePath,NSError*error){NSLog(@"Filedownloadedto:%@",filePath); }]; [downloadTaskresume];3、创建一个上传文件的任务
[objc]view plaincopyNSURLSessionConfiguration*configuration=[NSURLSessionConfigurationdefaultSessionConfiguration]; AFURLSessionManager*manager=[AFURLSessionManageralloc]initWithSessionConfiguration:configuration];NSURL*URL=[NSURLURLWithString:@"[]()"];NSURLRequest*request=[NSURLRequestrequestWithURL:URL];NSURL*filePath=[NSURLfileURLWithPath:@"file://path/to/image.png"];NSURLSessionUploadTask*uploadTask=[manageruploadTaskWithRequest:requestfromFile:filePathprogress:nilcompletionHandler:^(NSURLResponse*response,idresponseObject,NSError*error){if(error){NSLog(@"Error:%@",error); }else{NSLog(@"Success:%@%@",response,responseObject); } }]; [uploadTaskresume];4、处理JSON或Plist响应
iOS应用在处理JSON和Plist响应的时候可以十分轻便将其转换成NSDictionary对象或者NSArray对像,AFHTTPRequestOpeartionManager默认就可以处理JSON或Plist响应,也就是说当我们re为appication/json、text/json,AFHTTPRequestOpeartionManager默认就可以处理,无需再次指定服务器响应解析器。
[objc]view plaincopy AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManagermanager];[AFHTTPResponseSerializerserializer];NSDictionary*parameter=@{@"location":@"长沙",@"output":@"json",@"ak":@"jlflVx1VTUahj05Q7GfB7PCf"}; [managerGET:@"[]()"parameters:parametersuccess:^(AFHTTPRequestOperation*operation,idresponseObject){NSLog(@"OK"); dic=responseObject;NSArray*keys=[dicallKeys];NSLog(@"%@",keys);//_datas=responseObject;//NSString*stringData=[NSStringalloc]initWithData:_datasencoding:NSUTF8StringEncoding];//NSLog(@"%@",stringData);}failure:^(AFHTTPRequestOperation*operation,NSError*error){NSLog(@"NOTOK"); }];