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];
}