zoukankan      html  css  js  c++  java
  • 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);

        }];

    }

    ```

  • 相关阅读:
    c#实现windows远程桌面连接程序
    基于.NET平台常用的框架整理
    c#无限循环线程如何正确退出
    c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
    coco2d-x convertToWorldSpace介绍
    Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value。Test code
    函数指针与指针函数返回值的区别
    游戏开发那些事
    lua 根据指定字符拆分table字符串(转载)
    实习和学习的双重压力
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5867707.html
Copyright © 2011-2022 走看看