宝哥iOS网络篇-AFNetworking基础使用指南

4,786 阅读2分钟

前言

AFNetworking和ASIHTTPRequest是iOS开发相对主流的框架,网上有很多对比的文章。

本人早在11年开始一直在使用ASI,当时非常流行,后来慢慢的开始使用AF。

如果让我新写一个项目,我会用AF,但我还是强烈建议俩者要兼顾,因为你也不知道你未来的工作项目中会用到什么。

准备

  • 版本: 我建议AFnetworking 3.0
  • 兼容性: iOS7+
  • 传送门:github下载地址 ('or' 使用cocoapods)

基本方法

  • Manager基础设置

    所有的请求方法都是AFHTTPSessionManager对象调用的,因此,我们需要做一些简单的配置 (很多默认值可以不用配置)

     - (AFHTTPSessionManager *)shareAFNManager
     {
       AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
       // 超时时间
       manager.requestSerializer.timeoutInterval = 30.0f;
       // 设置请求头
       //[manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
       // 设置接收的Content-Type
       manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];
       return manager;
     }
    

    注:  很多网络请求会报错,因为没有添加 @"text/plain" ,AF默认的设置里是没有这个的

  • GET请求

    - (void)doGetRequest
    {
       //创建请求地址
       NSString *url=@"http://120.76.205.241:8000/news/qihoo?";
       //设置参数
       NSDictionary *parameters=@{@"kw":@"白",
                                 @"site":@"qq.com",
                                 @"apikey":@"你的key"};
       //AFN管理者调用get请求方法
       [[self shareAFNManager] GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
         //返回请求返回进度
         NSLog(@"downloadProgress-->%@",downloadProgress);
       } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
          //请求成功返回数据 根据responseSerializer 返回不同的数据格式
          NSLog(@"responseObject-->%@",responseObject);
       } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
          //请求失败
          NSLog(@"error-->%@",error);
       }];
    }
    
  • POST请求

    - (void)doPostRequest
    {
      //创建请求地址
      NSString *url=@"http://120.76.205.241:8000/news/qihoo?";
      //构造参数
      NSDictionary *parameters=@{@"kw":@"白",
                                 @"site":@"qq.com",
                                 @"apikey":@"你的key"};
    
      [[self shareAFNManager] POST:url parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
          //返回请求返回进度
          NSLog(@"downloadProgress-->%@",uploadProgress);
      } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
          //请求成功返回数据 根据responseSerializer 返回不同的数据格式
          NSLog(@"responseObject-->%@",responseObject);
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
          //请求失败
          NSLog(@"error-->%@",error);
      }];
        
    }
    

使用技巧

由于AFHTTPSessionManager是单例的模式,

我们在APP启动后配置一次,之后通过每次初始化单例,来调用get或者post方法,显然这样的做法并不是很好。

[AFHTTPSessionManager manager]

我建议:在AF的基础上做一层封装

  • 一个Request类:
    作为网络请求,里面有对Manager的配置,公共参数的判断设置等等逻辑
  • 一个Respone类:
    作为对于网络请求后,响应的数据,包括对Error的处理(AF的,接口返回的)等等

在后面的更新中,我会单独写一篇关于网络请求封装的文章。本篇只做基础使用的介绍。

注意:iOS9

在iOS9+的版本中,如果你的网络请求是http的,请按如下方法修改info.plist文件。

添加App Transport Security Settings (NSDictionary类型)

继续添加 key: Allow Arbitrary Loads (Boolean类型) value:YES

本篇示例代码

需要示例代码,请点我!

HeHeThirdCodeDemo 是集成了很多第三方库Demo的项目,写有大量注释,且在不断的更新维护中。有兴趣的朋友可以点击下载。



如有任何问题,可以在下方留言,我会及时解答。