IOS-AFNetworking

    AFNetworking是一个轻量级的iOS网络通信类库。AFNetworking 是当前 iOS 和 Mac OS X 开发中最广泛使用的开源项目之一。它帮助了成千上万叫好又叫座的应用,也为其它出色的开源库提供了基础。这个项目是社区里最活跃、最有影响力的项目之一,拥有 8700 个 star、2200 个 fork 和 130 名贡献者。

安装

使用CocoaPods安装。


在Podfile中增加下列代码
platform :ios, '7.0'
pod 'AFNetworking', '~> 2.0'

[官方地址:]https://github.com/AFNetworking/AFNetworking

使用

首先导入AFNetworking.h


#import "AFNetworking.h"

其次实例化一个请求管理器AFHTTPRequestOperationManager。


AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

设置请求的数据格式:默认是HTTP


//设置为JSON格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];

//设置为HTTP
manager.requestSerializer = [AFHTTPRequestSerializer serializer];

设置响应的数据格式:默认是JSON


//设置为JSON格式
manager.responseSerializer = [AFJSONResponseSerializer serializer];

//设置为HTTP
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

请求超时设置


manager.requestSerializer.timeoutInterval = 10;

设置请求客户端的语言,服务端国际化会根据请求客户端的语言选择对应的提示语言


NSArray *languages = [NSLocale preferredLanguages];
NSString *currentLanguage = [languages objectAtIndex:0];

[manager.requestSerializer setValue:currentLanguage forHTTPHeaderField:@"Accept-Language"];

允许访问自定义https


[manager.securityPolicy setAllowInvalidCertificates:YES];

AFHTTPRequestOperationManager封装了通过HTTP协议与Web应用程序进行通讯的常用方法。


//GET方式
    [manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        ...
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        ...
    }];

//PUT方式
[manager PUT:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        ...
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        ...
    }];

//POST方式
[manager POST :url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
       ...
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        ...
    }];

//DELETE方式
[manager DELETE:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        ...
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        ...
    }];

关于返回值

如果设置返回格式为JSON,则可以把responseObject直接当做数组(NSArray)或者字典(NSDictionary)来使用。


NSString *str = [responseObject objectForKey:@"KEY 1"];
NSArray *arr = [responseObject objectForKey:@"KEY 2"];
NSDictionary *dic = [responseObject objectForKey:@"KEY 3"];

或者使用NSJSONSerialization来转换。


NSArray *jsonArray= [NSJSONSerialization JSONObjectWithData:operation.responseData options:kNilOptions error:nil];

NSDictionary *json= [NSJSONSerialization JSONObjectWithData:operation.responseData options:kNilOptions error:nil];

如果设置返回值格式为HTTP,并且设置acceptableContentTypes为"text/html",如果要展现网页内容使用下列代码 operation.responseString,如果是从response中获取属性,使用下列代码


NSDictionary *json= [NSJSONSerialization JSONObjectWithData:operation.responseData options:kNilOptions error:nil];

关于请求失败

请求失败,可以通过AFHTTPRequestOperation获取HTTP的状态号码。


NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)operation.response;
NSInteger responseStatusCode= [httpResponse statusCode];

通过operation.responseString,可以获取在response中设置的错误信息。

通过error.localizedDescription,可以获取本地错误信息,如没有网络等。

关于判断网络情况


-(void)discoverNetworkStatus{
    NSURL *url=[NSURL URLWithString:@"http://www.apple.com"];
    AFHTTPRequestOperationManager *operationManager=[[AFHTTPRequestOperationManager alloc]initWithBaseURL:url];

    //根据不同的网络状态改变去做相应处理
    [operationManager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"2G/3G/4G Connection.");

                self.networkStatus=AFNetworkReachabilityStatusReachableViaWWAN;
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WiFi Connection.");

                self.networkStatus=AFNetworkReachabilityStatusReachableViaWiFi;
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"Network not found.");

                self.networkStatus=AFNetworkReachabilityStatusNotReachable;
                break;

            default:
                NSLog(@"Unknown.");

                self.networkStatus=AFNetworkReachabilityStatusUnknown;
                break;
        }
    }];

    //开始监控
    [operationManager.reachabilityManager startMonitoring];
}