ios开发网络学习AFN三:AFN的序列化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios开发网络学习AFN三:AFN的序列化相关的知识,希望对你有一定的参考价值。
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController ()<NSXMLParserDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self httpData2]; } //返回的是JSON数据 -(void)json { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON // NSDictionary *paramDict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) response:请求头信息 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager GET:@"http://120.25.226.186:32812/login" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@---%@",[responseObject class],responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } //返回的是XML -(void)xml { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //http://120.25.226.186:32812/login?username=123&pwd=122&type=JSON // //注意:如果返回的是xml数据,那么应该修改AFN的解析方案 manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; NSDictionary *paramDict = @{ @"type":@"XML" }; //2.发送GET请求 /* 第一个参数:请求路径(不包含参数).NSString 第二个参数:字典(发送给服务器的数据~参数) 第三个参数:progress 进度回调 第四个参数:success 成功回调 task:请求任务 responseObject:响应体信息(JSON--->OC对象) 第五个参数:failure 失败回调 error:错误信息 响应头:task.response */ [manager GET:@"http://120.25.226.186:32812/video" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task,NSXMLParser *parser) { //NSLog(@"%@---%@",[responseObject class],responseObject); //NSXMLParser *parser =(NSXMLParser *)responseObject; //设置代理 parser.delegate = self; //开始解析 [parser parse]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } //返回的二进制数据 -(void)httpData { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; /** 响应体信息默认返回的是json类型:AFN有三种类型,默认json,xml,还有其他, * 1:注意:如果返回的是xml数据,那么应该修改AFN的解析方案AFXMLParserResponseSerializer,manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; 2:注意:如果返回的数据既不是xml也不是json那么应该修改解析方案为: manager.responseSerializer = [AFHTTPResponseSerializer serializer]; */ manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //2.发送GET请求 [manager GET:@"http://120.25.226.186:32812/resources/images/minion_01.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) { NSLog(@"%@-",[responseObject class]); //UIImage *image = [UIImage imageWithData:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } /** * AFN的未知数据类型:像是什么text/html,text/plain,是AFN不支持的,所以必须配置,最好在外部去配置,不要修改AFN内部框架的内容。需要配置两项:1:告诉AFN能够接受text/html类型的数据, manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 2:若不是json,xml,其他类型的必须配置低三种类型: manager.responseSerializer = [AFHTTPResponseSerializer serializer]。二者缺一不可 */ -(void)httpData2 { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //告诉AFN能够接受text/html类型的数据 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //2.发送GET请求 [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) { NSLog(@"%@-%@",[responseObject class],[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); //UIImage *image = [UIImage imageWithData:responseObject]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败--%@",error); }]; } #pragma mark ---------------------- #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
/*
1.AFN它内部默认把服务器响应的数据当做json来进行解析,所以如果服务器返回给我的不是JSON数据那么请求报错,这个时候需要设置AFN对响应信息的解析方式。AFN提供了三种解析响应信息的方式,分别是:
1)AFXMLParserResponseSerializer----XML
2) AFHTTPResponseSerializer---------默认二进制响应数据
3)AFJSONResponseSerializer---------JSON
2.还有一种情况就是服务器返回给我们的数据格式不太一致(开发者工具Content-Type:text/xml),那么这种情况也有可能请求不成功。解决方法:
1) 直接在源代码中修改,添加相应的Content-Type
2) 拿到这个属性,添加到它的集合中
3.相关代码
-(void)srializer
{
//1.创建请求管理者,内部基于NSURLSession
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/* 知识点1:设置AFN采用什么样的方式来解析服务器返回的数据*/
//如果返回的是XML,那么告诉AFN,响应的时候使用XML的方式解析
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//如果返回的就是二进制数据,那么采用默认二进制的方式来解析数据
//manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//采用JSON的方式来解析数据
//manager.responseSerializer = [AFJSONResponseSerializer serializer];
/*知识点2 告诉AFN,再序列化服务器返回的数据的时候,支持此种类型
[AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
//2.把所有的请求参数通过字典的方式来装载,GET方法内部会自动把所有的键值对取出以&符号拼接并最后用?符号连接在请求路径后面
NSDictionary *dict = @{
@"username":@"223",
@"pwd":@"ewr",
@"type":@"XML"
};
//3.发送GET请求
[manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
//4.请求成功的回调block
NSLog(@"%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
//5.请求失败的回调,可以打印error的值查看错误信息
NSLog(@"%@",error);
}];
}
```
以上是关于ios开发网络学习AFN三:AFN的序列化的主要内容,如果未能解决你的问题,请参考以下文章