IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传
白羽 2019-05-21 来源 :网络 阅读 385 评论 0

摘要:本文将带你了解IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传,希望本文对大家学IOS有所帮助。


IOS开发入门iOS开发-使用AFN实现GET/POST请求,以及文件下载/文件(图片)上传


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 () @end @implementation  ViewController -(void)touchesBegan:(NSSet*)touches  withEvent:(UIEvent *)event{    [self  httpData2];} //返回的是JSON数据-(void)json{    //1.创建会话管理者    AFHTTPSessionManager  *manager = [AFHTTPSessionManager  manager];     //https://120.25.226.186:32812/login?username=123&pwd=122&type=JSON    //     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);    }];} //返回的是XML-(void)xml{    //1.创建会话管理者    AFHTTPSessionManager  *manager = [AFHTTPSessionManager  manager];     //https://120.25.226.186:32812/login?username=123&pwd=122&type=JSON    //     //注意:如果返回的是xml数据,那么应该修改AFN的解析方案    manager.responseSerializer  = [AFXMLParserResponseSerializer  serializer];     NSDictionary *paramDict =  @{                                @"type":@"XML"                                };    //2.发送GET请求    /*     第一个参数:请求路径(不包含参数).NSString     第二个参数:字典(发送给服务器的数据~参数)     第三个参数:progress  进度回调     第四个参数:success  成功回调        task:请求任务        responseObject:响应体信息(JSON--->OC对象)     第五个参数:failure  失败回调        error:错误信息     响应头:task.response     */    [manager  GET:@"https://120.25.226.186:32812/video" parameters:paramDict  progress:nil success:^(NSURLSessionDataTask * _Nonnull task,NSXMLParser  *parser)  {         //NSLog(@"%@---%@",[responseObject  class],responseObject);        //NSXMLParser  *parser =(NSXMLParser  *)responseObject;         //设置代理        parser.delegate  = self;         //开始解析        [parser  parse];     } failure:^(NSURLSessionDataTask *  _Nullable task, NSError * _Nonnull error) {        NSLog(@"请求失败--%@",error);    }];} //返回的二进制数据-(void)httpData{    //1.创建会话管理者    AFHTTPSessionManager  *manager = [AFHTTPSessionManager manager];     //注意:如果返回的是xml数据,那么应该修改AFN的解析方案AFXMLParserResponseSerializer    //注意:如果返回的数据既不是xml也不是json那么应该修改解析方案为:    //manager.responseSerializer  = [AFXMLParserResponseSerializer serializer];    manager.responseSerializer  = [AFHTTPResponseSerializer  serializer];     //2.发送GET请求    [manager  GET:@"https://120.25.226.186:32812/resources/images/minion_01.png"  parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull  task,id  _Nullable responseObject)  {        NSLog(@"%@-",[responseObject  class]);         //UIImage  *image = [UIImage imageWithData:responseObject];    }  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)  {        NSLog(@"请求失败--%@",error);    }];} -(void)httpData2{    //1.创建会话管理者    AFHTTPSessionManager  *manager = [AFHTTPSessionManager  manager];     //注意:如果返回的是xml数据,那么应该修改AFN的解析方案AFXMLParserResponseSerializer    //注意:如果返回的数据既不是xml也不是json那么应该修改解析方案为:    //manager.responseSerializer  = [AFXMLParserResponseSerializer  serializer];     //告诉AFN能够接受text/html类型的数据    manager.responseSerializer.acceptableContentTypes  = [NSSet  setWithObject:@"text/html"];     manager.responseSerializer  = [AFHTTPResponseSerializer  serializer];     //2.发送GET请求    [manager  GET:@"https://www.baidu.com" parameters:nil progress:nil  success:^(NSURLSessionDataTask * _Nonnull task,id  _Nullable  responseObject)  {        NSLog(@"%@-%@",[responseObject  class],[[NSString alloc]initWithData:responseObject  encoding:NSUTF8StringEncoding]);         //UIImage  *image = [UIImage imageWithData:responseObject];    }  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)  {        NSLog(@"请求失败--%@",error);    }];} #pragma  mark ----------------------#pragma mark  NSXMLParserDelegate-(void)parser:(NSXMLParser *)parser  didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    NSLog(@"%@--%@",elementName,attributeDict);}  


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程