最近有个项目任务: 在容联云通讯demo的基础上添加<开始录制>以及<结束录制>的按钮,分别有两个请求,但是这两个请求是xml格式的
1.请求体格式是xml
2.响应包体既数据返回也是xml格式类型
实现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:@" ",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: