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,那么就會報錯。所以單例的話,還是添加支持類型比較合適,返回的時候再根據具體類型做具體處理。