继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

幕布斯6054654
关注TA
已关注
手记 1258
粉丝 219
获赞 1011

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


webp

image.png

1.请求体格式是xml

webp

image.png

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

webp

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];
}



作者:择一城终老_蜗牛
链接:https://www.jianshu.com/p/6f881934946e


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP