美文网首页基础应用我爱编程
ios xml格式的数据请求以及解析

ios xml格式的数据请求以及解析

作者: 择一城终老_蜗牛 | 来源:发表于2018-08-09 16:02 被阅读733次

    最近有个项目任务: 在容联云通讯demo的基础上添加<开始录制>以及<结束录制>的按钮,分别有两个请求,但是这两个请求是xml格式的


    image.png

    1.请求体格式是xml

    image.png

    2.响应包体既数据返回也是xml格式类型

    image.png

    实现xml请求有两种方法:

    1.苹果原生请求方式

    2.AFNetWorking请求

    苹果原生请求方式

    点击按钮发送请求

    //容联云封装的方法  其实点击按钮直接请求即可
    - (void)PostUrlXml:(NSString *)url xmlString:(NSString *) xmlString parameters:(id)info completion:(ECRequestCompletion)completion failure:(void (^)(NSURLSessionDataTask *task, NSError *))failure{
        
    //该url是 https://imapp.yuntongxun.com:443/2013-12-26/Application/8a216da86058d6fa0160733a80240a8a/call/transmission?sig=8AD46BB8229C4E3CC3A7F003FDD62078&type=2&mode=2&sign=1
    //我直接将参数 添加到url后了
    //sig=8AD46BB8229C4E3CC3A7F003FDD62078&type=2&mode=2&sign=1
        NSURL *URL = [NSURL URLWithString:url];
    //xmlString 我以nsstring的形式写过来
    //[NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Request><ConfVideoRecord confid=\"%@\"/></Request>",self.meetingRoomNum];
        NSString *xmlStr = xmlString;
    //将其转化为data类型 目的是设置请求体 因为在苹果原生方法中HTTPBody是NSData类型
    //   NSData *HTTPBody;
        NSData *postData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding];
    
    //******NSMutableURLRequest是NSURLRequest的子类,常用方法有 (需求需要包头包体设置参数内容)
    //1、设置请求超时等待时间(超过这个时间就算超时,请求失败)
    //- (void)setTimeoutInterval:(NSTimeInterval)seconds;
    //2、设置请求方法(比如GET和POST)
    //- (void)setHTTPMethod:(NSString*)method;
    //3、设置请求体
    //- (void)setHTTPBody:(NSData*)data;
    //4、设置请求头
    //- (void)setValue:(NSString*)value forHTTPHeaderField:(NSString*)field;
    
    //---post请求一般都是采用NSMutableURLRequest 进行网络请求,因为post请求一般包括 body 参数 或者 head。---/
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    //设置请求头
        [request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        [request setValue:@"application/xml" forHTTPHeaderField:@"Accept"];
        NSString *timerStr = [NSString sigTime:[NSDate date]];
        NSString *authorBase64 = [NSString stringWithFormat:@"%@:%@", ECSDK_Key,timerStr];
        authorBase64 = [[authorBase64 dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        [request setValue:authorBase64 forHTTPHeaderField:@"Authorization"];
    //设置请求方法
        [request setHTTPMethod:@"POST"];
    //设置请求体
        [request setHTTPBody:postData];
        
    ---使用NSURLSession,拢共分两步:
    
        第一步 通过NSURLSession的实例创建task
        第二部 执行task
    
    
    //关于NSURLSession的初始化使用  
    //[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
    //(百度很久看到一种解释:苹果倡导使用https,且该接口也是https请求,如果后端使用私有的证书,会出现很多问题
    //,比如证书过期啊、不受信任等,这样我们不管是调用接口还是打开网页,都会失败 
    //出处参考👇:http://blog.csdn.net/u012138272/article/details/76714099)
    //关于NSURLSession相关  查看下面👇地址
    //https://www.jianshu.com/p/fafc67475c73
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
    //如果使用上面初始化  其实可以用NSURLSessionTaskDelegate代理方法,如果想要在接收数据过程中做进一步的处理
    // (因为要使用代理方法,就不需要block方式的初始化了,我没用代理方法是因为懒懒懒- -!)
    //可以这样操作:NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
    
    
    //摘抄一些代理方法
    // 1.接收到服务器的响应
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
        // 允许处理服务器的响应,才会继续接收服务器返回的数据
    completionHandler(NSURLSessionResponseAllow);
    }
    // 2.接收到服务器的数据(可能调用多次)
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
        // 处理每次接收的数据
    }
    
    // 3.请求成功或者失败(如果失败,error有值)- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
        // 请求完成,成功或者失败的处理
    }
    
    
    
    //NSURLSessionTask可以简单理解为任务:如数据请求任务,下载任务,上传任务等(这里请求任务且带block的回调方法)
    
        NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 
    //-----------------分割线(至此xml请求已经完成,除了最最最后一步[task resume];)------------------------
    //之后是关于解析xml格式的返回内容:
             if (error) {
                 NSLog(@"有错误error:%@",error);
             } else {
    //将返回的数据data  用字符串的形式打印出来
                 NSLog(@"data数据:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                
                 NSXMLParser *parseer = [[NSXMLParser alloc] initWithData:data];
                 parseer.delegate = self;
                 [parseer parse];
    
             }
        }];
    
        //Tips:
       // 所有类型的task都要调用resume方法才会开始进行请求.
        [task resume];
    }
    

    tips:

    相关文章

      网友评论

        本文标题:ios xml格式的数据请求以及解析

        本文链接:https://www.haomeiwen.com/subject/fefpgxtx.html