摘要:本文将带你了解IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传,希望本文对大家学IOS有所帮助。
本文将带你了解IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传,希望本文对大家学IOS有所帮助。
AFNetworking
AFNetworking这个牛逼的框架相信大家都已经很了解了,这里就不班门弄斧了,这里主要是给新入门的同学介绍一下AFN的简单介绍,版本历史,框架结构和基本使用。
AFNetworking的简单介绍以及版本历史
AFN的链接:GitHub
AFN是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]; //https://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:@"https://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:@"https://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:@"https://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:@"https://120.25.226.186:32812/upload" parameters:nil
constructingBodyWithBlock:^(id _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 ()
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号