AFN的序列化处理
当我们向服务器发送一个请求,服务器在返回数据的时候会在内部自动进行反序列化(JSON-->OC)处理,也就是说该框架内部会默认将返回的数据当作JSON处理,而当我们请求的数据不是JSON数据时,比如xml数据、图片、网页时就没法解析或者发送回错误的数据,那么这时我们应该怎么办呢?以下代码就上述问题一一举例做了解答,具体代码如下:
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()<NSXMLParserDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self httpData2];
}
//要求:传参数以JSON的方式来传参数
//manager.requestSerializer = [AFJSONRequestSerializer serializer];
-(void)json{
//01 创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSDictionary *dict = @{@"username":@"wujian",@"pwd":@"wujian",@"type":@"JSON"};
//02 发送GET请求
[manager GET:@"http://120.2512/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error -- %@",error);
}];
}
-(void)xml{
//01 创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSDictionary *dict = @{@"type":@"XML"};
//如果返回的数据是XML,那么应该修改对响应的处理方式为XML
// manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//02 发送GET请求
[manager GET:@"http://120.812/video" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@",responseObject);
//该请求服务器返回的是XML数据
//而AFN默认以JSON的方式来处理XML数据
//01 创建XML解析器
NSXMLParser *parser = (NSXMLParser *)responseObject;
//02 设置代理
parser.delegate = self;
//03 开始解析
[parser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error -- %@",error);
}];
}
-(void)httpData
{
//01 创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//如果服务器返回的数据既不是JSON也不是XML,那么久设置HTTP的解析方式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//02 发送GET请求
[manager GET:@"http://www.baidu.com/uploadImages/2014/062/5FM7VSW8745Y_1000x500.jpg" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@",[responseObject class]);
UIImage *Image = [UIImage imageWithData:responseObject];
self.imageView.image = Image;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error -- %@",error);
}];
}
-(void)httpData2
{
//01 创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//如果服务器返回的数据既不是JSON也不是XML,那么久设置HTTP的解析方式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//02 发送GET请求
[manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error -- %@",error);
}];
}
#pragma mark NSXMLParserDelegate
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"%@---%@",elementName,attributeDict);
}
@end