ios 使用afn怎么afn上传多张图片url键值对格式的参数

iOS-利用AFNetworking(AFN)-实现文件上传_iOS开发_
iOS-利用AFNetworking(AFN)-实现文件上传
来源:人气:2254
&官方建议AFN的使用方法
&1. 定义一个全局的AFHttpClient:包含有
& & 1& baseURL
& & 2& 请求
& & 3& 操作队列 NStionQueue
&2. 由AFHTTequestOperation负责所有的网络操作请求
0.导入框架准备工作                                   
&1. 将框架程序拖拽进项目
&2.& 添加iOS框架引用
&SystemConfiguration.framework
&MobileCoreServices.framework
#import "AFNetworking.h"
4. 修改xxx-Prefix.pch文件
&#import &MobileCoreServices/MobileCoreServices.h&
&#import &SystemConfiguration/SystemConfiguration.h&
1.AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理  
1 @interfaceViewController ()
// AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
AFHTTPClient
NSOperationQueue *_
1 - (void)viewDidLoad
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"http://192.168.3.255/~apple/qingche"];
_httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
_queue = [[NSOperationQueue alloc] init];
2.利用AFN实现文件上传操作细节                            
1 #pragma mark - 文件上传
2 - (IBAction)uploadImage
此段代码如果需要修改,可以调整的位置
1. 把upload.改成网站开发人员告知的地址
2. 把file改成网站开发人员告知的字段名
// 1. httpClient-&url
// 2. 上传请求POST
NSURLRequest *request = [_httpClient multartFormRequestWithMethod:@"POST" path:@"upload.php" parameters:nil constructingBodyWithBlock:^(id&AFMultipartFormData& formData) {
// 在此位置生成一个要上传的数据体
// form对应的是html文件中的表单
UIImage *image = [UIImage imageNamed:@"头像1"];
NSData *data = UIImagePNGRepresentation(image);
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
// 要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 设置时间格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
此方法参数
1. 要上传的[二进制数据]
2. 对应网站上[upload.php中]处理文件的[字段"file"]
3. 要保存在服务器上的[文件名]
4. 上传文件的[mimeType]
[formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/png"];
// 3. operation包装的urlconnetion
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responbject) {
NSLog(@"上传完成");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"上传失败-&%@", error);
[_httpClient.operationQueue addOperation:op];
作者:&清澈Saup出处:本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
优质网站模板AFN框架基本使用 - 简书
下载简书移动应用
写了23497字,被32人关注,获得了33个喜欢
AFN框架基本使用
1.AFN框架基本使用
1.1 AFN内部结构
- NSURLConnection
+ AFURLConnectionOperation
+ AFHTTPRequestOperation
+ AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)
* baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
* requestSerializer :请求数据格式/默认是二进制的 HTTP
* responseSerializer :响应的数据格式/默认是 JSON 格式
* operationQueue
* reachabilityManager :网络连接管理器
* manager :方便创建管理器的类方法
* HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
- NSURLSession
+ AFURLSessionManager
+ AFHTTPSessionManager(封装了常用的 HTTP 方法)
* UIKit + AFNetworking 分类
* NSProgress :利用KVO
- 半自动的序列化&反序列化的功能
+ AFURLRequestSerialization :请求的数据格式/默认是二进制的
+ AFURLResponseSerialization :响应的数据格式/默认是JSON格式
- 附加功能
+ 安全策略
* AFSecurityPolicy
+ 网络检测
* 对苹果的网络连接检测做了一个封装
* AFNetworkReachabilityManager
可以学习下AFN对 UIKit 做了一些分类, 对自己能力提升是非常有帮助的
1.2 AFN的基本使用
(1)发送GET请求的两种方式(POST同)
-(void)get1
//1.创建AFHTTPRequestOperationManager管理者
//AFHTTPRequestOperationManager内部是基于NSURLConnection实现的
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//2.发送请求
http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个url并创建请求对象
第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,以选择直接拼接还是转换为NSData放到请求体中传递
第三个参数:请求成功之后回调Block
第四个参数:请求失败回调Block
NSDictionary *param = @{
@"username":@"520it",
@"pwd":@"520it"
//注意:字符串中不能包含空格
[manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id
_Nonnull responseObject) {
NSLog(@"请求成功---%@",responseObject);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"失败---%@",error);
-(void)get2
//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) {
NSLog(@"请求成功---%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"失败---%@",error);
(2)使用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 =
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 filePathU
} 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",pletedUnitCount,progress.totalUnitCount,1.0 * pletedUnitCount/progress.totalUnitCount);
1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类。
2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
4.该方法通常还会提供对GET或POST请求的封装。
5.在外面的时候通过该工具类来发送请求
6.单例方法:
+ (instancetype)shareNetworkTools
static XMGNetworkTools *
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
// 注意: BaseURL中一定要以/结尾
instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
2.AFN文件上传
1.文件上传拼接数据的第一种方式
[formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
2.文件上传拼接数据的第二种方式
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
3.文件上传拼接数据的第三种方式
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
4.【注】在资料中已经提供了一个用于文件上传的分类。
/*文件上传相关的代码如下*/
-(void)upload
//1.创建一个请求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.发送POST请求上传数据
第一个参数:请求路径:NSString类型
第二个参数:要上传的非文件参数
第三个参数:block回调
在该回调中,需要利用formData拼接即将上传的二进制数据
第三个参数:上传成功的block回调
task:dataTask(任务)
responseObject:服务器返回的数据
第四个参数:上传失败的block回调
error:错误信息,如果上传文件失败,那么error里面包含了错误的描述信息
NSDictionary *dict = @{
@"username":@"cherry"
[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":@"cherry"
[manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id&AFMultipartFormData&
_Nonnull formData) {
//本地文件的url
NSURL *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);
3.使用AFN进行序列化处理
1.AFN它内部默认把服务器响应的数据当做json来进行解析,所以如果服务器返回给我的不是JSON数据那么请求报错,这个时候需要设置AFN对响应信息的解析方式。AFN提供了三种解析响应信息的方式,分别是:
1)AFXMLParserResponseSerializer----XML
2) AFHTTPResponseSerializer---------默认二进制响应数据
3)AFJSONResponseSerializer---------JSON
2.还有一种情况就是服务器返回给我们的数据格式不太一致(开发者工具Content-Type:text/xml),那么这种情况也有可能请求不成功。解决方法:
1) 直接在源代码中修改,添加相应的Content-Type
2) 拿到这个属性,添加到它的集合中
3.相关代码
-(void)srializer
//1.创建请求管理者,内部基于NSURLSession
AFHTTPSessionManager *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/xml"];
//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.请求成功的回调block
NSLog(@"%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
//5.请求失败的回调,可以打印error的值查看错误信息
NSLog(@"%@",error);
4.使用AFN来检测网络状态
说明:可以使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变,也可以利用苹果提供的Reachability来监听。建议在开发中直接使用AFN框架处理。
//使用AFN框架来检测网络状态的改变
-(void)AFNReachability
//1.创建网络监听管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//2.监听网络状态的改变
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
= 没有网络
AFNetworkReachabilityStatusReachableViaWWAN = 3G
AFNetworkReachabilityStatusReachableViaWiFi = WIFI
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
//3.开始监听
[manager startMonitoring];
------------------------------------------------------------
//使用苹果提供的Reachability来检测网络状态,如果要持续监听网络状态的概念,需要结合通知一起使用。
//提供下载地址:/library/ios/samplecode/Reachability/Reachability.zip
-(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];
//持有该对象,不要让该对象释放掉
//当控制器释放的时候,移除通知的监听
-(void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
-(void)networkChange
//获取当前网络的状态
if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
NSLog(@"当前网络状态为3G");
if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
NSLog(@"当前网络状态为wifi");
NSLog(@"当前没有网络");
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
· 22875人关注
收集 iOS && Android 开发的知识,解决大家遇到的问题,讨论移动前端开发的前沿,欢迎大家投稿~
投稿须知:
· 330人关注
· 96人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:下次自动登录
关注移动互联网和移动APP开发工具、开发框架、测试工具、微信开发、Android源码、Android开源类库以及各种开源组件的IT科技网站
现在的位置:
IOS—-轻松掌握AFN网络顶级框架
一、什么是AFN
全称是AFNetworking,是对NSURLConnection的一层封装
虽然运行效率没有ASI高,但是使用比ASI简单
在iOS开发中,使用比较广泛
二、AFN结构
NSURLConnection
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)
baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
requestSerializer :请求数据格式/默认是二进制的 HTTP
responseSerializer :响应的数据格式/默认是 JSON 格式
operationQueue
reachabilityManager :网络连接管理器
manager :方便创建管理器的类方法
HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
NSURLSession
AFURLSessionManager
AFHTTPSessionManager(封装了常用的 HTTP 方法)
UIKit + AFNetworking 分类
NSProgress :利用KVO
半自动的序列化&反序列化的功能
AFURLRequestSerialization :请求的数据格式/默认是二进制的
AFURLResponseSerialization :响应的数据格式/默认是JSON格式
AFSecurityPolicy
对苹果的网络连接检测做了一个封装
AFNetworkReachabilityManager
三、AFN基本使用
1.AFHTTPSessionManager
是AFN中最重要的对象之一
封装了HTTP请求的常见处理
GET/POST请求
解析服务器的响应数据
创建AFHTTPSessionManager
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
AFHTTPSessionManager的GET/POST请求
// GET请求
& & &http://120.25.226.186:32812/login?username=520it&pwd=520it
& & &第一个参数: 请求的地址 &http://120.25.226.186:32812/login
& & &第二个参数: 请求的参数 &username=520it&pwd=520it
& & &第三个参数: 请求成功的回调
& & &第四个参数: 请求失败的回调
& & &只要利用AFN发送请求, 如果服务器返回的是JSON数据, 那么AFN会自动将JSON转会成OC对象返回给我们
- (NSURLSessionDataTask *)GET:(NSString *)URLString
& & & & & & & & & &parameters:(id)parameters
& & & & & & & & & &success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
& & & & & & & & & &failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
// POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
& & & & & & & & & &parameters:(id)parameters
& & & & & & & & & &success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
& & & & & & & & & &failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
- (void)get2
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@&username& : @&520it&,
@&pwd& : @&520it&
[manager GET:@&http://120.25.226.186:32812/login& parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@&请求成功---%@&, responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@&请求失败---%@&, error);
- (void)post2
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@&username& : @&520it&,
@&pwd& : @&520it&
[manager POST:@&http://120.25.226.186:32812/login& parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@&请求成功---%@&, responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@&请求失败---%@&, error);
2.AFHTTPRequestOperationManager
创建AFHTTPRequestOperationManager
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestOperationManager的GET/POST请求
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
// POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
- (void)get
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@&username& : @&520it&,
@&pwd& : @&520it&
[manager GET:@&http://120.25.226.186:32812/login& parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@&请求成功---%@&, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@&请求失败---%@&, error);
- (void)post
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2.利用AFN管理者发送请求
NSDictionary *params = @{
@&username& : @&520it&,
@&pwd& : @&520it&
[manager POST:@&http://120.25.226.186:32812/login& parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@&请求成功---%@&, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@&请求失败---%@&, error);
四、AFN文件
// 执行下载文件的方法,可以监控下载进度
- (void)downLoadMonitor
// 1.创建网络管理者
// AFHTTPSessionManager 基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用网络管理者下载数据
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@&http://120.25.226.186:32812/resources/videos/minion_02.mp4&]];
destination
- targetPath: 给我们自动写入的文件路径
- block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
completionHandler
- url :destination返回的URL == block的返回的路径
@property int64_t totalUnitC
需要下载文件的总大小
@property int64_t completedUnitC 当前已经下载的大小
NSProgress *progress =
NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@&%@&,filePath.absoluteString);
要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
NSProgress只是一个对象!如何跟踪进度!-& KVO 对属性变化的监听!
@property int64_t totalUnitC
@property int64_t completedUnitC
完成单位数
// 给Progress添加监听 KVO
[progress addObserver:self forKeyPath:@&completedUnitCount& options:NSKeyValueObservingOptionNew context:nil];
// 3.启动任务
[downTask resume];
// 收到通知调用的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object change:(NSDictionary *)change context:(void *)context
NSLog(@&%f&,1.0 * pletedUnitCount / object.totalUnitCount);
// 回到主队列刷新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.progress.progress = 1.0 * pletedUnitCount / object.totalUnitC
五、AFN序列化
默认是JSON数据,接收类型是JSON
如果接收的类型和返回的类型不匹配会报错
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 默认请求二进制
// 默认响应是JSON
// 告诉AFN,支持接受 text/xml 的数据
// [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@&text/xml&];
// 告诉AFN如何解析数据
// 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 告诉AFN客户端, 将返回的数据当做XML来处理
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
六、AFN文件上传
// formData: 专门用于拼接需要上传的数据
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
constructingBodyWithBlock:(void (^)(id &AFMultipartFormData& formData))block
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
AFN上传文件代码示例
// 1.创建网络管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.利用网络管理者上传数据
NSDictionary *dict = @{@&username&:@&Syl&};
// formData: 专门用于拼接需要上传的数据
[manager POST:@&http://120.25.226.186:32812/upload& parameters:dict constructingBodyWithBlock:
^void(id&AFMultipartFormData& formData) {
Data: 需要上传的数据
name: 服务器参数的名称
fileName: 文件名称
mimeType: 文件的类型
UIImage *image =[UIImage imageNamed:@&minion_02&];
NSData *data = UIImagePNGRepresentation(image);
[formData appendPartWithFileData:data name:@&file& fileName:@&abc.png& mimeType:@&image/png&];
NSURL *url = [NSURL fileURLWithPath:@&/Users/apple/Desktop/CertificateSigningRequest.certSigningRequest&];
// 任意的二进制数据MIMEType application/octet-stream
// [formData appendPartWithFileURL:url name:@&file& fileName:@&abc.cer& mimeType:@&application/octet-stream& error:nil];
[formData appendPartWithFileURL:url name:@&file& error:nil];
} success:^void(NSURLSessionDataTask * task, id responseObject) {
// 请求成功
NSLog(@&请求成功 %@&, responseObject);
} failure:^void(NSURLSessionDataTask * task, NSError * error) {
// 请求失败
NSLog(@&请求失败 %@&, error);
七、监控联网状态
1.AFN监控联网状态
联网状态status
// 2.设置监听
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@&%d&, status);
2.Reachability监控联网状态苹果提供,导入这两个类使用
// 1.检测wifi状态
Reachability *wifi = [Reachability reachabilityForLocalWiFi];
// 2.检测手机是否能上网络(WIFI/3G/2.5G)
Reachability *conn = [Reachability reachabilityForInternetConnection];
// 3.判断网络状态
if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
NSLog(@&有wifi&);
} else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
NSLog(@&使用手机自带网络进行上网&);
} else { // 没有网络
NSLog(@&没有网络&);
①判断联网状态
// [wifi currentReachabilityStatus] != NotReachable
// [conn currentReachabilityStatus] != NotReachable
// 没有用WIFI, 只用了手机网络
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] != NotReachable
// 没有网络
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] == NotReachable
②实时监听网络状态
#import &ViewController.h&
#import &Reachability.h&
@interface HMViewController ()
@property (nonatomic, strong) Reachability *
@implementation HMViewController
- (void)viewDidLoad
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil];
self.conn = [Reachability reachabilityForInternetConnection];
[self.conn startNotifier];
- (void)dealloc
[self.conn stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
- (void)checkNetworkState
// 1.检测wifi状态
Reachability *wifi = [Reachability reachabilityForLocalWiFi];
// 2.检测手机是否能上网络(WIFI/3G/2.5G)
Reachability *conn = [Reachability reachabilityForInternetConnection];
// 3.判断网络状态
if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
NSLog(@&有wifi&);
} else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
NSLog(@&使用手机自带网络进行上网&);
} else { // 没有网络
NSLog(@&没有网络&);
【上篇】【下篇】}

我要回帖

更多关于 ios afn上传json数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信