iOS-AFNetWorking的应用

  AFNetWorking是一款被广泛应用与iOS和OS X平台的网络库。它是基于Foundation URL Loading System来构建的,它扩展了很多Cocoa框架功能,将它们与定制的高级网络请求方法相融合。他还有非常好的模块化结构和丰富的API接口。

  我们这里使用的是AFNetWorking的2.6.3的版本。在iOS升级到9.0以后,官方推荐使用NSURLSession来替代NSURLConnection来进行网络请求,所以现在的AFNetWorking的最新版本已经到了3.x.x了,新本版是基于NSURLSession进行构建的。虽然版本有所不同,但是并不影响我们的使用,而且2.6.3是比较稳定的一个版本,参考和学习价值还是很高的。
  由于我们这次还是使用http请求,需要对iOS9.0做一些处理,解除http请求限制。参考解决方法:传送门

AFNetWorking的安装

我们这里采用的安装方式是使用Cocoapods进行安装,详细的Cocoapods安装和使用方法不多做介绍,给个传送门-Cocoapods安装和使用
首先我们需要在项目目录下创建一个文件Podfile,里面添加如下内容:

platform :ios, '8.0'
pod 'AFNetworking', '~> 2.6.3'

然后执行命令。

pod install

GET和POST请求

AFHTTPRequestOperationManager包含了大多数基于HTTP的WEB应用网络请求模式,包括请求的创建,响应的序列化,网络可达性监测,安全和请求操作管理。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager GET:@"http://www.baidu.com" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject)
{
    //请求返回的数据(二进制数据)
    NSLog(@"responseObject(二进制) = %@",responseObject);
    //转化二进制数据
    NSLog(@"responseObject = %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    //获取请求的头部信息
    NSLog(@"请求的头部信息 = %@", operation.request.allHTTPHeaderFields);
    //获取请求返回数据的头部信息
    NSLog(@"返回数据的头部信息 = %@", operation.response);

} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
    //请求失败
    NSLog(@"%@", error);
}];

当用户请求成功时会执行success块的代码,我们可以根据operation参数获取请求或者响应数据的头部信息,通过头部信息查看有时候也可以发现一些问题。responseObject参数里存储了请求返回的数据。默认是二进制流的形式,可以通过字符编码转成我们需要的格式。

POST请求和GET请求是类似,我们只需要把方法改成发送POST请求即可。但是POST请求一般会附带一些要传的参数,可以通过该方法的parameters来传参,该参数需要的是一个NSDictionary键值对对象。

NSDictionary *param = @{@"wd":@"天气"};

[manager POST:@"http://www.baidu.com" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject)
 {
     NSLog(@"responseObject = %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

 } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
     //请求失败
     NSLog(@"%@", error);
 }];

序列化请求和响应

在上面我们看到这样两句,它们制定了请求和响应分别使用的序列化方式,在GET请求例子中两个使用的都是HTTP请求序列化方式,发送和响应的都是二进制流数据。此外还有别的序列化方式,比如说JSON,XML等常用的数据格式。

<AFURLRequestSerialization>
    AFHTTPRequestSerializer
    AFJSONRequestSerializer
    AFPropertyListRequestSerializer

<AFURLResponseSerialization>
    AFHTTPResponseSerializer
    AFJSONResponseSerializer
    AFXMLParserResponseSerializer
    AFXMLDocumentResponseSerializer (Mac OS X)
    AFPropertyListResponseSerializer
    AFImageResponseSerializer
    AFCompoundResponseSerializer

网络可达性

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            [operationQueue setSuspended:NO];
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            [operationQueue setSuspended:YES];
            break;
    }
}];

[manager.reachabilityManager startMonitoring];

持续更新…

参考资料

  1. AFNetWorking-Github
  2. 使用AFNetworking进行网络状态的监测