使用SOAP访问Web服务

来源:互联网 发布:行知职高新疆部 编辑:程序博客网 时间:2024/05/22 01:36
<span style="font-size:18px;">SOAP是简单对象访问协议,它可看成是HTTP与XML的结合,其中XML部分是作为HTTP报文的实体主体部分。具体信息可以参考百度百科。在iOS中使用SOAP,需要我们自己组装XML格式的字符串,当XML字符串比较长的时候会变得很麻烦。另外,我们在写XML格式的字符串时也要经常使用转义字符“\”。看看刚才那个网页的内容,注意到SOAP 1.2标签下的内容:POST /WebServices/MobileCodeWS.asmx HTTP/1.1Host: webservice.webxml.com.cnContent-Type: application/soap+xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">  <soap12:Body>    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">      <mobileCode>string</mobileCode>      <userID>string</userID>    </getMobileCodeInfo>  </soap12:Body></soap12:Envelope>上面的这段文本就是使用SOAP 1.2的请求报文格式,就是一个HTTP请求报文,注意空行上面的那些内容中的请求行与各首部行的每个字段名,在下面的示例中会用到。这个HTTP请求报文的实体主体部分是XML格式的一段文本,注意Body标签之间的内容。服务器的响应报文格式如下:HTTP/1.1 200 OKContent-Type: application/soap+xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">  <soap12:Body>    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>    </getMobileCodeInfoResponse>  </soap12:Body></soap12:Envelope>我们要用到的只有getMobileCodeInfoResult这个标签。在文本输入框的Attribute Inspector中设置其Keyboard属性为Number Pad。3、之后向ViewController.h中,为文本输入框创建OutLet映射,名称为:phoneNumber;为“查询”按钮创建Action映射,事件类型为Touch Up Inside,名称为:doQuery。建立映射的方法就是打开Assistant Editor,选中某一控件,按住Ctrl,拖向ViewController.h,可以参考前面的文章。4、在ViewController.h中添加代码:<NSXMLParserDelegate,  NSURLConnectionDelegate>@property (strong, nonatomic) NSMutableData *webData;@property (strong, nonatomic) NSMutableString *soapResults;@property (strong, nonatomic) NSXMLParser *xmlParser;@property (nonatomic) BOOL elementFound;@property (strong, nonatomic) NSString *matchingElement;@property (strong, nonatomic) NSURLConnection *conn;// 开始查询- (IBAction)doQuery:(id)sender {    NSString *number = phoneNumber.text;        // 设置我们之后解析XML时用的关键字,与响应报文中Body标签之间的getMobileCodeInfoResult标签对应    matchingElement = @"getMobileCodeInfoResult";    // 创建SOAP消息,内容格式就是网站上提示的请求报文的实体主体部分    NSString *soapMsg = [NSString stringWithFormat:                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"                         "<soap12:Envelope "                         "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "                         "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "                         "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"                         "<soap12:Body>"                         "<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"                         "<mobileCode>%@</mobileCode>"                         "<userID>%@</userID>"                         "</getMobileCodeInfo>"                         "</soap12:Body>"                         "</soap12:Envelope>", number, @""];        // 将这个XML字符串打印出来    NSLog(@"%@", soapMsg);    // 创建URL,内容是前面的请求报文报文中第二行主机地址加上第一行URL字段    NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"];    // 根据上面的URL创建一个请求    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMsg length]];    // 添加请求的详细信息,与请求报文前半部分的各字段对应    [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];    // 设置请求行方法为POST,与请求报文第一行对应    [req setHTTPMethod:@"POST"];    // 将SOAP消息加到请求中    [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];    // 创建连接    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];    if (conn) {        webData = [NSMutableData data];    }}5.3 在@end之前添加代码#pragma mark -#pragma mark URL Connection Data Delegate Methods// 刚开始接受响应时调用-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{    [webData setLength: 0];}// 每接收到一部分数据就追加到webData中-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data {    [webData appendData:data];}// 出现错误时-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error {    conn = nil;    webData = nil;}// 完成接收数据时调用-(void) connectionDidFinishLoading:(NSURLConnection *) connection {    NSString *theXML = [[NSString alloc] initWithBytes:[webData mutableBytes]                                                length:[webData length]                                              encoding:NSUTF8StringEncoding];        // 打印出得到的XML    NSLog(@"%@", theXML);    // 使用NSXMLParser解析出我们想要的结果    xmlParser = [[NSXMLParser alloc] initWithData: webData];    [xmlParser setDelegate: self];    [xmlParser setShouldResolveExternalEntities: YES];    [xmlParser parse];}在@end之前添加代码#pragma mark -#pragma mark XML Parser Delegate Methods// 开始解析一个元素名-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {    if ([elementName isEqualToString:matchingElement]) {        if (!soapResults) {            soapResults = [[NSMutableString alloc] init];        }        elementFound = YES;    }}// 追加找到的元素值,一个元素值可能要分几次追加-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {    if (elementFound) {        [soapResults appendString: string];    }}// 结束解析这个元素名-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {    if ([elementName isEqualToString:matchingElement]) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"手机号码信息"                                                        message:[NSString stringWithFormat:@"%@", soapResults]                                                       delegate:self                                              cancelButtonTitle:@"确定"                                              otherButtonTitles:nil];        [alert show];        elementFound = FALSE;        // 强制放弃解析        [xmlParser abortParsing];    }}// 解析整个文件结束后- (void)parserDidEndDocument:(NSXMLParser *)parser {    if (soapResults) {        soapResults = nil;    }}// 出错时,例如强制结束解析- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {    if (soapResults) {        soapResults = nil;    }}</span>

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 商品房没有门厅业主该怎么办 公帐付款备注错了怎么办 我是农村户口在外省交社保怎么办 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办 申请公租房工资超了怎么办 重庆公租房工资超了怎么办 公租房申请父母房子贷款怎么办 公产房父母去世办公证怎么办 动迁过程中承租人去世了怎么办 公租房的房间带阳台怎么办 公租房合同到期没有社保怎么办 租房合同没有到期违约了怎么办 租房户到期不搬怎么办 公租房摇号摇到了又怎么办 公租房被清退会怎么办 公租房摇不到号怎么办 公租房到期不搬怎么办 租房到期租客不搬怎么办 房产证面积与实际不符怎么办 社保晚交了1天怎么办 个人社保忘交了怎么办 个人社保晚交了怎么办 医保晚交了几天怎么办 辞职后转为灵活就业养老怎么办 公司名称变更提取不了公积金怎么办 五险合一软件已经减员怎么办 法人社保不在投标单位怎么办 换工作单位后社保怎么办 在北京孩子没有一老一小怎么办 深户小孩怎么办社保卡 社保卡没办下来去医院住院怎么办 老年社保卡丢了怎么办 外墙掉瓷砖伤车伤人怎么办 医保卡姓名弄错了怎么办