当前位置:   article > 正文

AFNetworking网络框架的基本使用

AFNetworking网络框架的基本使用

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 中设置
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
 
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
代码示例:
  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:^
  12. (NSURLSessionDataTask *task, id responseObject) {
  13. NSLog(@"请求成功---%@", responseObject);
  14. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  15. NSLog(@"请求失败---%@", error);
  16. }];
  17. }
  18. // POST
  19. - (void)post2
  20. {
  21. // 1.创建AFN管理者
  22. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  23. // 2.利用AFN管理者发送请求
  24. NSDictionary *params = @{
  25. @"username" : @"520it",
  26. @"pwd" : @"520it"
  27. };
  28. [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^
  29. (NSURLSessionDataTask *task, id responseObject) {
  30. NSLog(@"请求成功---%@", responseObject);
  31. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  32. NSLog(@"请求失败---%@", error);
  33. }];
  34. }

2.AFHTTPRequestOperationManager

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

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

五、AFN序列化

默认是JSON数据,接收类型是JSON
 
如果接收的类型和返回的类型不匹配会报错

  1. // 1.创建AFN管理者
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 默认请求二进制
  4. // 默认响应是JSON
  5. // 告诉AFN,支持接受 text/xml 的数据
  6. // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet
  7. setWithObject:@"text/xml"];
  8. // 告诉AFN如何解析数据
  9. // 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
  10. // manager.responseSerializer = [AFJSONResponseSerializer serializer];
  11. // 告诉AFN客户端, 将返回的数据当做XML来处理
  12. // manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  13. // 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)
  14. 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
  7. constructingBodyWithBlock:
  8. ^void(id<AFMultipartFormData> formData) {
  9. /*
  10. Data: 需要上传的数据
  11. name: 服务器参数的名称
  12. fileName: 文件名称
  13. mimeType: 文件的类型
  14. */
  15. UIImage *image =[UIImage imageNamed:@"minion_02"];
  16. NSData *data = UIImagePNGRepresentation(image);
  17. [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png"
  18. mimeType:@"image/png"];
  19. /*
  20. NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/
  21. CertificateSigningRequest.certSigningRequest"];
  22. // 任意的二进制数据MIMEType application/octet-stream
  23. // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer"
  24. mimeType:@"application/octet-stream" error:nil];
  25. [formData appendPartWithFileURL:url name:@"file" error:nil];
  26. */
  27. } success:^void(NSURLSessionDataTask * task, id responseObject) {
  28. // 请求成功
  29. NSLog(@"请求成功 %@", responseObject);
  30. } failure:^void(NSURLSessionDataTask * task, NSError * error) {
  31. // 请求失败
  32. NSLog(@"请求失败 %@", error);
  33. }];

七、监控联网状态

1.AFN监控联网状态
联网状态status
  1. // 2.设置监听
  2. /*
  3. AFNetworkReachabilityStatusUnknown = -1, 未识别
  4. AFNetworkReachabilityStatusNotReachable = 0, 未连接
  5. AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
  6. AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi
  7. */
  8. 示例代码
  9. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  10. // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
  11. [manager startMonitoring];
  12. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  13. NSLog(@"%d", status);
  14. }];

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) {
  9. // 没有使用wifi, 使用手机自带网络进行上网
  10. NSLog(@"使用手机自带网络进行上网");
  11. } else { // 没有网络
  12. NSLog(@"没有网络");
  13. }
  14. ①判断联网状态
  15. // 用WIFI
  16. // [wifi currentReachabilityStatus] != NotReachable
  17. // [conn currentReachabilityStatus] != NotReachable
  18. // 没有用WIFI, 只用了手机网络
  19. // [wifi currentReachabilityStatus] == NotReachable
  20. // [conn currentReachabilityStatus] != NotReachable
  21. // 没有网络
  22. // [wifi currentReachabilityStatus] == NotReachable
  23. // [conn currentReachabilityStatus] == NotReachable
  24. ②实时监听网络状态
  25. #import "ViewController.h"
  26. #import "Reachability.h"
  27. @interface HMViewController ()
  28. @property (nonatomic, strong) Reachability *conn;
  29. @end
  30. @implementation HMViewController
  31. - (void)viewDidLoad
  32. {
  33. [super viewDidLoad];
  34. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState)
  35.  name:kReachabilityChangedNotification object:nil];
  36. self.conn = [Reachability reachabilityForInternetConnection];
  37. [self.conn startNotifier];
  38. }
  39. - (void)dealloc
  40. {
  41. [self.conn stopNotifier];
  42. [[NSNotificationCenter defaultCenter] removeObserver:self];
  43. }
  44. - (void)checkNetworkState
  45. {
  46. // 1.检测wifi状态
  47. Reachability *wifi = [Reachability reachabilityForLocalWiFi];
  48. // 2.检测手机是否能上网络(WIFI\3G\2.5G)
  49. Reachability *conn = [Reachability reachabilityForInternetConnection];
  50. // 3.判断网络状态
  51. if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
  52. NSLog(@"有wifi");
  53. } else if ([conn currentReachabilityStatus] != NotReachable) {
  54. // 没有使用wifi, 使用手机自带网络进行上网
  55. NSLog(@"使用手机自带网络进行上网");
  56. } else { // 没有网络
  57. NSLog(@"没有网络");
  58. }
  59. }
  60. @end




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/629938
推荐阅读
相关标签
  

闽ICP备14008679号