关于添加AFNetworking返回的数据类型
2016-12-02 本文已影响614人
上发条的树
1、从AFNetworking的源码里可以看出,默认支持的返回数据类型如下几个:
- (instancetype)init {
self = [super init];
if (!self) {
return nil;
}
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
return self;
}
如果想要支持其他的数据类型,例如@"text/html", @"text/xml",那么,这样添加支持类型:
@interface MyHttp : AFHTTPSessionManager
+(instancetype)sharedInstance;
@end
@implementation MyHttp
+(instancetype)sharedInstance{
static MyHttp *myHttp = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//URL
myHttp = [[MyHttp alloc]initWithBaseURL:[NSURL URLWithString:xBaseUrl]];
//添加返回数据的类型支持
NSMutableSet *acceptableSet = [NSMutableSet setWithSet:myHttp.responseSerializer.acceptableContentTypes];
[acceptableSet addObject:@"text/html"];
myHttp.responseSerializer.acceptableContentTypes = acceptableSet;
});
}
-(instancetype)initWithBaseURL:(NSURL *)url{
self = [super initWithBaseURL:url];
if (self) {
}
return self;
}
@end
成功添加了返回数据的支持类型,解析数据的时候,就可以根据接口的文档,做相应的处理。(一般我都是不在AFNetworking二次封装里面做判断,都是到业务层再去判断,因为项目中大部分的接口都是返回json,只有一两个接口是返回其他其他类型的数据)当然如果非要判断数据,也是可以的:
if([responseObject isKindOfClass:[NSDictionary class]]){
NSLog(@"%@",responseObject);
}
//xml/html
else if([responseObject isKindOfClass:[NSData class]]){
NSLog(@"%@",responseObject);
}
如果是网络请求写成一个单例,那么以下这种方式(告诉AFNetworking返回的数据以什么类型去解析)的类型支持就不合适了:
myHttp.responseSerializer = [AFJSONResponseSerializer serializer];
//myHttp.responseSerializer = [AFXMLParserResponseSerializer serializer];
设置了一种类型,如上,就只支持json类型。如果是返回xml,那么就会报错。所以单例的话,还是添加支持类型比较合适,返回的时候再根据具体类型做具体处理。