AFN基本使用

GET请求:

-(void)get1
{// 1.创建AFHTTPSessionManager管理者// AFHTTPSessionManager内部是基于NSURLSession实现的AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];// 2.发送请求NSDictionary *param = @{@"username":@"520it",@"pwd":@"520it"};// 注意:responseObject:请求成功返回的响应结果(AFN内部已经把响应体转换为OC对象,通常是字典或数组)/*第一个参数:请求路径(不包含参数)第二个参数:字典(发送给服务器的参数)第三个参数:成功的回调*/[manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {//task里面包含了响应头信息NSLog(@"请求成功---%@",[responseObject class]);} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {NSLog(@"失败---%@",error);}];}
}
-(void)post1
{// 1.创建AFHTTPSessionManager管理者// AFHTTPSessionManager内部是基于NSURLSession实现的AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];// 2.发送请求NSDictionary *param = @{@"username":@"520it",@"pwd":@"520it"};// 注意:responseObject:请求成功返回的响应结果(AFN内部已经把响应体转换为OC对象,通常是字典或数组)/*第一个参数:请求路径(不包含参数)第二个参数:字典(发送给服务器的参数)第三个参数:成功的回调*/[manager POST:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {//task里面包含了响应头信息NSLog(@"请求成功---%@",[responseObject class]);} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {NSLog(@"失败---%@",error);}];}
}

AFN实现文件下载


-(void)download
{//1.创建一个管理者AFHTTPSessionManager *manage  = [AFHTTPSessionManager manager];//2.下载文件/*第一个参数:请求对象第二个参数:下载进度第三个参数:block回调,需要返回一个url地址,用来告诉AFN下载文件的目标地址targetPath:AFN内部下载文件存储的地址,tmp文件夹下response:请求的响应头返回值:文件应该剪切到什么地方第四个参数:block回调,当文件下载完成之后调用response:响应头filePath:文件存储在沙盒的地址 == 第三个参数中block的返回值error:错误信息*///2.1 创建请求对象NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];//2.2 创建下载进度,并监听NSProgress *progress = nil;NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];//拼接文件全路径NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];return filePathUrl;} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {NSLog(@"文件下载完毕---%@",filePath);}];//2.3 使用KVO监听下载进度[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];//3.启动任务[downloadTask resume];
}//获取并计算当前文件的下载进度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary<NSString *,id> *)change context:(void *)context
{NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
}

文件上传:

-(void)upload
{//1.创建一个请求管理者AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//2.发送POST请求上传数据/*第一个参数:请求路径:NSString类型第二个参数:要上传的非文件参数第三个参数:block回调在该回调中,需要利用formData拼接即将上传的二进制数据第三个参数:上传成功的block回调task:dataTask(任务)responseObject:服务器返回的数据第四个参数:上传失败的block回调error:错误信息,如果上传文件失败,那么error里面包含了错误的描述信息*/NSDictionary *dict = @{@"username":@"wenidngding"};[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {//把本地的图片转换为NSData类型的数据UIImage *image = [UIImage imageNamed:@"123"];NSData *data = UIImagePNGRepresentation(image);/*//拼接二进制文件数据第一个参数:要上传的文件的二进制数据第二个参数:服务器接口规定的名称第三个参数:这个参数上传到服务器之后用什么名字来进行保存第四个参数:上传文件的MIMEType类型*/[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {NSLog(@"请求成功---%@",responseObject);} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {NSLog(@"请求失败--%@",error);}];
}-(void)upload2
{NSLog(@"%s",__func__);//1.创建一个请求管理者AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//2.发送POST请求上传数据/*第一个参数:请求路径:NSString类型第二个参数:要上传的非文件参数第三个参数:block回调在该回调中,需要利用formData拼接即将上传的二进制数据第三个参数:上传成功的block回调task:dataTask(任务)responseObject:服务器返回的数据第四个参数:上传失败的block回调error:错误信息,如果上传文件失败,那么error里面包含了错误的描述信息*/NSDictionary *dict = @{@"username":@"wenidngding"};[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {//本地文件的urlNSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/文顶顶/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];/*//拼接二进制文件数据第一个参数:要上传文件的url路径第二个参数:服务器要求的参数名称第三个参数:这个文件上传到服务器之后叫什么名称第四个参数:文件的mimetype类型第五个参数:错误信息*/
//        [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];//另外一种上传文件的方式/*说明:该方法和上面的方法等价,不过该方法更加简单其内部会自动的的根据url路径确定文件保存名称,并通过内部方法获取上传文件的mimetype类型*/[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {NSLog(@"请求成功---%@",responseObject);} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {NSLog(@"请求失败--%@",error);}];
}

AFN使用技巧

1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,在控制器中真正发请求的代码使用自己封装的工具类。
2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
4.该方法通常还会提供对GET或POST请求的封装。
5.在外面的时候通过该工具类来发送请求
6.单例方法:

+ (instancetype)shareNetworkTools
{static XMGNetworkTools *instance;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{// 注意: BaseURL中一定要以/结尾instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];});return instance;
}

AFN序列化相关

AFN它内部默认把服务器响应的数据当做json来进行解析,所以如果服务器返回给我的不是JSON数据那么请求报错,这个时候需要设置AFN对响应信息的解析方式。

AFN提供了三种解析响应信息的方式,分别是:
1)AFXMLParserResponseSerializer----XML
2) AFHTTPResponseSerializer---------默认二进制响应数据
3)AFJSONResponseSerializer---------JSON

还有一种情况就是服务器返回给我们的数据格式不太一致(开发者工具Content-Type:text/html),那么这种情况也有可能请求不成功。解决方法:
1) 直接在源代码中修改,添加相应的Content-Type
2) 拿到这个属性,添加到它的集合中

xml解析

-(void)srializer
{//1.创建请求管理者,内部基于NSURLSessionAFHTTPSessionManager *manager = [AFHTTPSessionManager manager];/* 知识点1:设置AFN采用什么样的方式来解析服务器返回的数据*///如果返回的是XML,那么告诉AFN,响应的时候使用XML的方式解析manager.responseSerializer = [AFXMLParserResponseSerializer serializer];//如果返回的就是二进制数据,那么采用默认二进制的方式来解析数据//manager.responseSerializer = [AFHTTPResponseSerializer serializer];//采用JSON的方式来解析数据//manager.responseSerializer = [AFJSONResponseSerializer serializer];/*知识点2 告诉AFN,再序列化服务器返回的数据的时候,支持此种类型[AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/html"];// 2.把所有的请求参数通过字典的方式来装载,GET方法内部会自动把所有的键值对取出以&符号拼接并最后用?符号连接在请求路径后面NSDictionary *dict = @{@"username":@"223",@"pwd":@"ewr",@"type":@"XML"};//3.发送GET请求[manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {//4.请求成功的回调blockNSLog(@"%@",[responseObject class]);} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {//5.请求失败的回调,可以打印error的值查看错误信息NSLog(@"%@",error);}];
}

html解析

-(void)html
{AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//有三种方式解析,需要手动设置AFN里面的方法???//content-type: text/html"manager.responseSerializer = [AFHTTPResponseSerializer serializer];manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];//2.发送请求[manager GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {NSLog(@"请求成功---%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"请求失败---%@",error);}];
}

监听网络状态的改变 AFNetworkReachabilityManager

//1.获得网络监测管理者AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];//2.检测/*AFNetworkReachabilityStatusUnknown          = 未知AFNetworkReachabilityStatusNotReachable     = 没有网络AFNetworkReachabilityStatusReachableViaWWAN = 蜂窝网络AFNetworkReachabilityStatusReachableViaWiFi = WIFI*/[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {switch (status) {case AFNetworkReachabilityStatusUnknown:NSLog(@"未知-----");break;case AFNetworkReachabilityStatusNotReachable:NSLog(@"没有网络");break;case AFNetworkReachabilityStatusReachableViaWWAN:NSLog(@"3G");break;case AFNetworkReachabilityStatusReachableViaWiFi:NSLog(@"wifi");break;default:break;}}];//3.开始监听  要监控网络连接状态,必须要先调用单例的startMonitoring方法[manager startMonitoring];

苹果原生的监听
使用苹果提供的Reachability来检测网络状态,如果要持续监听网络状态的变化,需要结合通知一起使用。

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//1.注册一个通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];//2.拿到一个对象,然后调用开始监听方法Reachability *r = [Reachability reachabilityForInternetConnection];[r startNotifier];//持有该对象,不要让该对象释放掉self.r = r;
}//当控制器释放的时候,移除通知的监听
-(void)dealloc
{[[NSNotificationCenter defaultCenter] removeObserver:self];[self.r stopNotifier];
}-(void)networkChange
{//获取当前网络的状态if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN){NSLog(@"当前网络状态为3G");return;}if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi){NSLog(@"当前网络状态为wifi");return;}NSLog(@"当前没有网络");
}

AFNetworking使用相关推荐

  1. 对AFNetworking的简单封装

    #import "YGLoadDataManager.h" #import "AFNetworking.h" @implementation YGLoadDat ...

  2. 详解AFNetworking的HTTPS模块

    0.0 简述 文章内容包括: AFNetworking简介 ATS和HTTPS介绍 AF中的证书验证介绍 如何创建服务端和客户端自签名证书 如何创建简单的https服务器 对CA正式证书和自签名证书的 ...

  3. HTTPS网络加密双向验证-使用AFNetworking封装

    1.首先使用OC封装请求头 #import <Foundation/Foundation.h> #import "AFNetworking.h" @interface ...

  4. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

  5. 使用 AFNetworking 进行 XML 和 JSON 数据请求

    (1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLD ...

  6. AFNetworking 源代码分析

    关于其他 AFNetworking 源代码分析的其他文章: AFNetworking 概述(一) AFNetworking 的核心 AFURLSessionManager(二) 处理请求和响应 AFU ...

  7. 源码阅读:AFNetworking(八)——AFAutoPurgingImageCache

    该文章阅读的AFNetworking的版本为3.2.0. AFAutoPurgingImageCache该类是用来管理内存中图片的缓存. 1.接口文件 1.1.AFImageCache协议 这个协议定 ...

  8. AFNetworking 3.0 断点续传 使用记录

    最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...

  9. iOS开发网络数据之AFNetworking使用

    如何选择AFNetworking版本 首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少.AFNetworking 2.0或者之后的版本需要xcode5 ...

  10. NSURLConnection实现文件上传和AFNetworking实现文件上传

    请求的步骤分为4步 1.创建请求 2.设置请求头(告诉服务器这是一个文件上传的请求) 3.设置请求体 4.发送请求 NSURLConnection实现文件上传 // 1.创建请求NSURL *url ...

最新文章

  1. 人体关键点颜色和预处理
  2. 天天用 Spring,bean 实例化原理你懂吗?
  3. CDS view注解解析 - @Environment.systemField
  4. 轻量级HTTP服务器Nginx(Nginx日常维护)
  5. 信息系统项目管理师-信息系统进度管理核心知识点思维脑图
  6. 磁盘管理之逻辑卷管理(Logical Volume Manager)
  7. 零基础学习前端开发,怎么自学javascript?
  8. 读书笔记——《沉思录》(1/4)
  9. imnoise2.m
  10. Excel如何删除表格中的空白列
  11. 产品设计方法论:用户体验五要素
  12. python 语料_用python从语料库中提取最常用的词
  13. 转载:联想小新进入BIOS方法
  14. 数据恢复必备宝典—BMP文件详解
  15. 所有的美好,都始于遇见
  16. 安科瑞变电所运维云平台AcrelCloud-1000实时监测
  17. 分号与逗号的区别及举例_顿号和逗号的区别
  18. Citrix 桌面虚拟化解决方案与VMware桌面虚拟化解决方案对比
  19. 循环神经网络RNN(含LSTM,GRU)小综述
  20. Zeppelin- Linux下安装Zeppelin

热门文章

  1. BAPI_GOODSMVT_CREATE(调拨 收货 发货 入库 退货)BAPI
  2. 微信电脑版聊天记录转移
  3. 【简易搭建个人博客】------- 基于BT面板的个人博客搭建
  4. SpringBoot事务详解
  5. 互联网人工智能下的OCR文字识别
  6. Anaconda安装及使用
  7. 新手java练习题100(1-5)
  8. 微信小程序使用百度地图api
  9. DOS下显示JPG/JPEG图像文件
  10. 初级测试小宝典 测试流程,不能复现bug,开发不认为是bug级2020测试点的热点提问的回答