AFN

一、什么是AFN

二、AFN结构

  • NSURLConnection

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)

      • 属性

        • baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
        • requestSerializer :请求数据格式/默认是二进制的 HTTP
        • responseSerializer :响应的数据格式/默认是 JSON 格式
        • operationQueue
        • reachabilityManager :网络连接管理器
      • 方法

        • manager :方便创建管理器的类方法
        • HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
        • GET
        • POST
  • NSURLSession

    • AFURLSessionManager
    • AFHTTPSessionManager(封装了常用的 HTTP 方法)

      • GET
      • POST
      • UIKit + AFNetworking 分类
      • NSProgress :利用KVO
  • 半自动的序列化&反序列化的功能

    • AFURLRequestSerialization :请求的数据格式/默认是二进制的
    • AFURLResponseSerialization :响应的数据格式/默认是JSON格式
  • 附加功能

    • 安全策略

      • HTTPS
      • AFSecurityPolicy
    • 网络检测

      • 对苹果的网络连接检测做了一个封装
      • AFNetworkReachabilityManager

三、AFN基本使用

1.AFHTTPSessionManager

  • 是AFN中最重要的对象之一
  • 封装了HTTP请求的常见处理
  • GET\POST请求
  • 解析服务器的响应数据

创建AFHTTPSessionManager

  1. AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

AFHTTPSessionManager的GET\POST请求

  1. // GET请求
  2. /*
  3. http://120.25.226.186:32812/login?username=520it&pwd=520it
  4. 第一个参数: 请求的地址 http://120.25.226.186:32812/login
  5. 第二个参数: 请求的参数 username=520it&pwd=520it
  6. 第三个参数: 请求成功的回调
  7. 第四个参数: 请求失败的回调
  8. 只要利用AFN发送请求, 如果服务器返回的是JSON数据, 那么AFN会自动将JSON转会成OC对象返回给我们
  9. */
  10. - (NSURLSessionDataTask *)GET:(NSString *)URLString
  11. parameters:(id)parameters
  12. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  13. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
  14. // POST请求
  15. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  16. parameters:(id)parameters
  17. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  18. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代码示例

  1. // GET
  2. - (void)get2
  3. {
  4. // 1.创建AFN管理者
  5. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  6. // 2.利用AFN管理者发送请求
  7. NSDictionary *params = @{
  8. @"username" : @"520it",
  9. @"pwd" : @"520it"
  10. };
  11. [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  12. NSLog(@"请求成功---%@", responseObject);
  13. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  14. NSLog(@"请求失败---%@", error);
  15. }];
  16. }
  17. // POST
  18. - (void)post2
  19. {
  20. // 1.创建AFN管理者
  21. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  22. // 2.利用AFN管理者发送请求
  23. NSDictionary *params = @{
  24. @"username" : @"520it",
  25. @"pwd" : @"520it"
  26. };
  27. [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  28. NSLog(@"请求成功---%@", responseObject);
  29. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  30. NSLog(@"请求失败---%@", error);
  31. }];
  32. }

2.AFHTTPRequestOperationManager

创建AFHTTPRequestOperationManager

  1. // 1.创建AFN管理者
  2. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  3. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

AFHTTPRequestOperationManager的GET\POST请求

  1. // GET
  2. - (NSURLSessionDataTask *)GET:(NSString *)URLString
  3. parameters:(id)parameters
  4. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  5. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
  6. // POST请求
  7. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  8. parameters:(id)parameters
  9. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  10. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代码示例

  1. - (void)get
  2. {
  3. // 1.创建AFN管理者
  4. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  5. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  6. // 2.利用AFN管理者发送请求
  7. NSDictionary *params = @{
  8. @"username" : @"520it",
  9. @"pwd" : @"520it"
  10. };
  11. [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
  12. NSLog(@"请求成功---%@", responseObject);
  13. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  14. NSLog(@"请求失败---%@", error);
  15. }];
  16. }
  17. - (void)post
  18. {
  19. // 1.创建AFN管理者
  20. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  21. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  22. // 2.利用AFN管理者发送请求
  23. NSDictionary *params = @{
  24. @"username" : @"520it",
  25. @"pwd" : @"520it"
  26. };
  27. [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
  28. NSLog(@"请求成功---%@", responseObject);
  29. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  30. NSLog(@"请求失败---%@", error);
  31. }];
  32. }

四、AFN文件下载

  1. // 执行下载文件的方法,可以监控下载进度
  2. - (void)downLoadMonitor
  3. {
  4. // 1.创建网络管理者
  5. // AFHTTPSessionManager 基于NSURLSession
  6. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  7. // 2.利用网络管理者下载数据
  8. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
  9. /*
  10. destination
  11. - targetPath: 系统给我们自动写入的文件路径
  12. - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
  13. completionHandler
  14. - url :destination返回的URL == block的返回的路径
  15. */
  16. /*
  17. @property int64_t totalUnitCount; 需要下载文件的总大小
  18. @property int64_t completedUnitCount; 当前已经下载的大小
  19. */
  20. NSProgress *progress = nil;
  21. NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
  22. NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
  23. NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
  24. return [NSURL fileURLWithPath:path];
  25. } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
  26. NSLog(@"%@",filePath.absoluteString);
  27. }];
  28. /*
  29. 要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
  30. NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
  31. @property int64_t totalUnitCount; 总单位数
  32. @property int64_t completedUnitCount; 完成单位数
  33. */
  34. // 给Progress添加监听 KVO
  35. [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
  36. // 3.启动任务
  37. [downTask resume];
  38. }
  39. // 收到通知调用的方法
  40. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object change:(NSDictionary *)change context:(void *)context
  41. {
  42. NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount);
  43. // 回到主队列刷新UI
  44. dispatch_async(dispatch_get_main_queue(), ^{
  45. self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount;
  46. });
  47. }

五、AFN序列化

  • 默认是JSON数据,接收类型是JSON

    • 如果接收的类型和返回的类型不匹配会报错
  1. // 1.创建AFN管理者
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 默认请求二进制
  4. // 默认响应是JSON
  5. // 告诉AFN,支持接受 text/xml 的数据
  6. // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
  7. // 告诉AFN如何解析数据
  8. // 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
  9. // manager.responseSerializer = [AFJSONResponseSerializer serializer];
  10. // 告诉AFN客户端, 将返回的数据当做XML来处理
  11. // manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  12. // 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)
  13. manager.responseSerializer = [AFHTTPResponseSerializer serializer];

六、AFN文件上传

  1. // formData: 专门用于拼接需要上传的数据
  2. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  3. parameters:(id)parameters
  4. constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
  5. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  6. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

AFN上传文件代码示例

  1. // 1.创建网络管理者
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 2.利用网络管理者上传数据
  4. NSDictionary *dict = @{@"username":@"Syl"};
  5. // formData: 专门用于拼接需要上传的数据
  6. [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:
  7. ^void(id<AFMultipartFormData> formData) {
  8. /*
  9. Data: 需要上传的数据
  10. name: 服务器参数的名称
  11. fileName: 文件名称
  12. mimeType: 文件的类型
  13. */
  14. UIImage *image =[UIImage imageNamed:@"minion_02"];
  15. NSData *data = UIImagePNGRepresentation(image);
  16. [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"];
  17. /*
  18. NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/CertificateSigningRequest.certSigningRequest"];
  19. // 任意的二进制数据MIMEType application/octet-stream
  20. // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer" mimeType:@"application/octet-stream" error:nil];
  21. [formData appendPartWithFileURL:url name:@"file" error:nil];
  22. */
  23. } success:^void(NSURLSessionDataTask * task, id responseObject) {
  24. // 请求成功
  25. NSLog(@"请求成功 %@", responseObject);
  26. } failure:^void(NSURLSessionDataTask * task, NSError * error) {
  27. // 请求失败
  28. NSLog(@"请求失败 %@", error);
  29. }];

七、监控联网状态

1.AFN监控联网状态

联网状态status

  1. // 2.设置监听
  2. /*
  3. AFNetworkReachabilityStatusUnknown = -1, 未识别
  4. AFNetworkReachabilityStatusNotReachable = 0, 未连接
  5. AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
  6. AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi
  7. */

示例代码

  1. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  2. // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
  3. [manager startMonitoring];
  4. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  5. NSLog(@"%d", status);
  6. }];

2.Reachability监控联网状态苹果提供,导入这两个类使用

  1. // 1.检测wifi状态
  2. Reachability *wifi = [Reachability reachabilityForLocalWiFi];
  3. // 2.检测手机是否能上网络(WIFI\3G\2.5G)
  4. Reachability *conn = [Reachability reachabilityForInternetConnection];
  5. // 3.判断网络状态
  6. if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
  7. NSLog(@"有wifi");
  8. } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
  9. NSLog(@"使用手机自带网络进行上网");
  10. } else { // 没有网络
  11. NSLog(@"没有网络");
  12. }

①判断联网状态

  1. // 用WIFI
  2. // [wifi currentReachabilityStatus] != NotReachable
  3. // [conn currentReachabilityStatus] != NotReachable
  4. // 没有用WIFI, 只用了手机网络
  5. // [wifi currentReachabilityStatus] == NotReachable
  6. // [conn currentReachabilityStatus] != NotReachable
  7. // 没有网络
  8. // [wifi currentReachabilityStatus] == NotReachable
  9. // [conn currentReachabilityStatus] == NotReachable

②实时监听网络状态

  1. #import "ViewController.h"
  2. #import "Reachability.h"
  3. @interface HMViewController ()
  4. @property (nonatomic, strong) Reachability *conn;
  5. @end
  6. @implementation HMViewController
  7. - (void)viewDidLoad
  8. {
  9. [super viewDidLoad];
  10. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil];
  11. self.conn = [Reachability reachabilityForInternetConnection];
  12. [self.conn startNotifier];
  13. }
  14. - (void)dealloc
  15. {
  16. [self.conn stopNotifier];
  17. [[NSNotificationCenter defaultCenter] removeObserver:self];
  18. }
  19. - (void)checkNetworkState
  20. {
  21. // 1.检测wifi状态
  22. Reachability *wifi = [Reachability reachabilityForLocalWiFi];
  23. // 2.检测手机是否能上网络(WIFI\3G\2.5G)
  24. Reachability *conn = [Reachability reachabilityForInternetConnection];
  25. // 3.判断网络状态
  26. if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
  27. NSLog(@"有wifi");
  28. } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
  29. NSLog(@"使用手机自带网络进行上网");
  30. } else { // 没有网络
  31. NSLog(@"没有网络");
  32. }
  33. }
  34. @end

 

 
 

AFNnetworking详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. 一些新的ideas

    k-means可以在不同的聚类点间加入计算该方向类内方差的方法改进,可以获得更好的效果: 可以通过爬虫方法在facebook上爬取与happy.sad相关的图片进行图片情感分类,并通过语义分析的方法提 ...

  2. 关于word excel 等的信息隐藏技术

    简单的word 信息隐藏技术分为两种 一  利用word自带的功能对信息进行隐藏,即选中要隐藏的文字 单击右键 选择字体  给隐藏选项打勾即可    这种信息隐藏比较简单  找到的方式为单机文件——找 ...

  3. YII2的增删改查

    insert into table (field1,field2)values('1','2');delete from table where   condition update  table s ...

  4. Apache常用配置项

    301是永久重定向 302是临时重定向 编辑虚拟主机的配置文件需要用到apache的rewrite模块 所以要用要先检查apache是否安装了rewrite模块 # ./bin/apachectl - ...

  5. 给linux 授权一个可以远程登录的账户

    创建用户:grant all on *.* to '; 授权:flush privileges;

  6. jQuery中的map()方法

    jQuery中map()方法的使用格式为:$(selector).map(callback(index,domElement)). 将在每一个被选元素上执行map()方法中设置的回调函数,在回调函数中 ...

  7. OpenGL观察轴

    旋转矩阵可以通过观察向量构造,观察向量可以是3D空间的两个或三个点.如果一个处于P1点的对象面向P2点,则观察向量就是P2-P1,如下图: 首先,前轴向量通过归一化的观察向量简单计算而来. 其次,左轴 ...

  8. Contiki学习笔记  第一个程序:Hello World

    想来想去,还是得先写一个程序,找下感觉,增强一下自信心,那就国际惯例Hello World吧.先到这个网址下一个Instant Contiki 2.7.之所以没用3.0的,是因为有些问题,我源码是下的 ...

  9. [2014.01.27]wfRadar 雷达图组件 2.5

    全新开发的雷达图组件--wfRadar,使用简单,功能强大,图像处理效果极佳. 组件支持多种图片格式,包括bmp,jpg,gif,wmf,emf,ico,png,pcx,tif,tga,pcx,dcx ...

  10. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...