陌生未来~缘

导航

ios 对于AFNetworking3.0的基本使用

AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。AFHTTPRequestOperationManager已经抛弃,所以需要对数据请求进行改动。

Get请求

1 //使用代码
2 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
3     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
4     [manager GET:url parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
5         //成功
6         NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
7     } failure:^(NSURLSessionDataTask *task, NSError *error) {
8         //失败
9     }];

 

    • 当我们调用get函数之前,我们需要创建一个AFHTTPSessionManager,在之前我们使用的一般是AFHTTPRequestOperationManager.

       
    • 在调用get请求后,我们一般都不需要干什么了,因为那些繁琐复杂的网络通信都交给他去做了,他首先会调用AFNetworkReachabilityManager验证是否联网.
    • 然后参数序列化,用于网络请求.
    • 调用AFSecurityPolicy类,AFSecurityPolicy用于验证HTTPS请求的证书,简单来说建立连接.
    • 连接建立完成,证书验证成功,开始请求服务器.
    • 从服务器返回数据,解析服务器数据,将数据反序列化.
    • 我们得到data类型的数据,可以使用JSON解析直接解析成字典使用.弃用的类:
    •     AFURLConnectionOperation
          AFHTTPRequestOperation
          AFHTTPRequestOperationManager
    • 两者之间对比

      AFN2.0:

      NSURL *URL = [NSURL URLWithString:@""];
      NSURLRequest *request = [NSURLRequest requestWithURL:URL];
      AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
      op.responseSerializer = [AFJSONResponseSerializer serializer];
      [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
              NSLog(@"JSON: %@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"Error: %@", error);
      }];
      [[NSOperationQueue mainQueue] addOperation:op];

       


      AFN3.0:
    • - (void)GETUrl:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure
      {
          if (!_sessionGetManager) {
              _sessionGetManager  = [AFHTTPSessionManager manager];
              //设置请求格式
              _sessionGetManager.responseSerializer = [AFJSONResponseSerializer serializer];;
          }
          // 设置请求超时时间
          //    _sessionGetManager.requestSerializer.timeoutInterval = 10;
          //设置允许接受返回数据类型
              _sessionGetManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json",@"text/plain", @"text/javascript", nil];
          NSLog(@"%@",url);
          [_sessionGetManager GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              success(responseObject);
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              NSLog(@"********%@",error);
              //        if (task.state == 2) {
              //            return ;
              //        }
              failure(error);
          }];
          
      }

       

    • - (void)POSTUrl:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure
      {
          if (!_sessionPostManager) {
              _sessionPostManager = [AFHTTPSessionManager manager];
              //接收数据类型 --->JSON
              _sessionPostManager.responseSerializer = [AFJSONResponseSerializer serializer];
              
          }
          //接收数据类型 --->JSON
          _sessionPostManager.responseSerializer = [AFJSONResponseSerializer serializer];
          //访问超时时间
          _sessionPostManager.requestSerializer.timeoutInterval = 30.f;
          
          _sessionPostManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",@"text/plain",nil];
          NSLog(@"url =%@",url);
          
          [_sessionPostManager POST:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              success(responseObject);
              
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              NSLog(@"%@",error);
              failure(error);
          }];
          
      }

       

      AFN3.0下载方法:

      /**
       *  AFN3.0 下载
       */
      - (void)downLoad{
      
          //1.创建管理者对象
          AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
          //2.确定请求的URL地址
          NSURL *url = [NSURL URLWithString:@""
      
      //如果报接受类型不一致请替换一致text/html或别的
          manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
      
      ]; //3.创建请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //下载任务 NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { //打印下下载进度 WKNSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { //下载地址 WKNSLog(@"默认下载地址:%@",targetPath); //设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]; return [NSURL URLWithString:filePath];
      
      } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
      
              //下载完成调用的方法
              WKNSLog(@"下载完成:");
              WKNSLog(@"%@--%@",response,filePath);
      
          }];
      
          //开始启动任务
          [task resume];
      
      }

       


      监测当前网络状态(网络监听)

      - (void)AFNetworkStatus{
      
          //1.创建网络监测者
          AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
      
          /*枚举里面四个状态  分别对应 未知 无网络 数据 WiFi
           typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
               AFNetworkReachabilityStatusUnknown          = -1,      未知
               AFNetworkReachabilityStatusNotReachable     = 0,       无网络
               AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窝数据网络
               AFNetworkReachabilityStatusReachableViaWiFi = 2,       WiFi
           };
           */
      
          [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
              //这里是监测到网络改变的block  可以写成switch方便
              //在里面可以随便写事件
              switch (status) {
                  case AFNetworkReachabilityStatusUnknown:
                      WKNSLog(@"未知网络状态");
                      break;
                  case AFNetworkReachabilityStatusNotReachable:
                      WKNSLog(@"无网络");
                      break;
      
                  case AFNetworkReachabilityStatusReachableViaWWAN:
                      WKNSLog(@"蜂窝数据网");
      
                      break;
      
                  case AFNetworkReachabilityStatusReachableViaWiFi:
                      WKNSLog(@"WiFi网络");
      
                      break;
      
                  default:
                      break;
              }
      
          }] ;
      }

       


      AFN3.0 上传

    • /**
       *  AFN 3.0 上传
       *      有两种方式
       *          upLoad1 和 upLoad2
       */
      
      //第一种方法是通过工程中的文件进行上传
      - (void)upLoad1{
      
          //1。创建管理者对象
          AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
      
          //2.上传文件
          NSDictionary *dict = @{@"username":@"1234"};
      
          NSString *urlString = @"22222";
          [manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
              //上传文件参数
              UIImage *iamge = [UIImage imageNamed:@"123.png"];
              NSData *data = UIImagePNGRepresentation(iamge);
              //这个就是参数
              [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];
      
          } progress:^(NSProgress * _Nonnull uploadProgress) {
      
              //打印下上传进度
              WKNSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
          } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
      
              //请求成功
              WKNSLog(@"请求成功:%@",responseObject);
      
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      
              //请求失败
              WKNSLog(@"请求失败:%@",error);
          }];
      
      }
      
      //第二种是通过URL来获取路径,进入沙盒或者系统相册等等
      - (void)upLoda2{
          //1.创建管理者对象
          AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
          //2.上传文件
          NSDictionary *dict = @{@"username":@"1234"};
      
          NSString *urlString = @"22222";
          [manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
      
              [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];
          } progress:^(NSProgress * _Nonnull uploadProgress) {
      
              //打印下上传进度
              WKNSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
          } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
      
              //请求成功
              WKNSLog(@"请求成功:%@",responseObject);
      
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      
              //请求失败
              WKNSLog(@"请求失败:%@",error);
          }];
      }

       

      总结的也不一定全面,还需要各位同僚共同努力,如有什么疑问,请加我扣扣:1123231279
    • 最后附上Github地址:https://github.com/wy08/RequestModel


       

posted on 2017-06-15 09:09  wyy23  阅读(259)  评论(0编辑  收藏  举报