Ajax通过SOAP协议调用Web服务

前段时间做了一个用Ajax调用Web服务的Demo,在此记录一下。调用的是一个地理编码服务,该服务可以将地址转换为地理坐标,如下所示:

Ajax通过SOAP协议调用Web服务

点击该服务可以看到该服务SOAP形式的请求与返回结果形式,如下图所示:

Ajax通过SOAP协议调用Web服务

我们用Ajax通过SOAP协议调用Web服务,其实就是要构建SOAP形式的请求的xml,如上图所示,请求的xml格式一定要与上面给出的SOAP1.1 request保持一致。首先看一下画红框的头信息,Ajax的调用必须是POST请求,并且Ajax的Content-Type和SOAPAction这两个头信息也必须和上文该服务给出的一致。如下所示:

var url = "https://www.ip-assistance.pt/ws/gpsg/gps.asmx";//注意是https				
				xmlHttp.open("post", url, true);
				xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
				xmlHttp.setRequestHeader("SOAPAction","http://www.ip-assistance.pt/WS/GPS/FreeTextGeoCode");

从上图中可以看到,浏览器地址栏中的协议是https,所以我们Ajax的url也必须是https://...

全部代码如下:

<!doctype>
<html>
	<head>
		<title></title>
		<style>
			table td.first{
				width:180px;
			}
		</style>		
	</head>
	<body>
		<div style="width:1000px;">
			<table style="width:100%;">
				<tr>
					<td class="first">lcCalle</td>
					<td><input type="text" id="lcCalle" value="Largo Jean Monnet" /></td>
				</tr>
				<tr>
					<td class="first">lnResultados</td>
					<td><input type="text" id="lnResultados" value="100" /></td>
				</tr>
			</table>
			<textarea id="textarea1" style="width:100%;height:400px;resize:none;"></textarea>
			<button style="display:block;" onclick="soapFreeTextGeoCode()">FreeTextGeoCode</button>
		</div>
		<script type="text/javascript">
			var textarea1 = document.getElementById("textarea1");
			
			function getXmlHttp(){
				var xmlHttp = null;
				try{  
					xmlHttp = new XMLHttpRequest();  
				}  
				catch(e){  
					try{  
						xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");  
					}  
					catch(e){  
						xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
					}  
				}
				return xmlHttp;
			}
		
			function soapFreeTextGeoCode(){
				var xmlHttp = getXmlHttp();
				if(!xmlHttp){
					alert("浏览器不支持Ajax !");
					return;
				}
				
				textarea1.value = "";
				var lcCalle = document.getElementById("lcCalle").value;
				var lnResultados = parseInt(document.getElementById("lnResultados").value);
				
				var data = "<?xml version='1.0' encoding='utf-8'?>";
				data += "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>";
				data += "<soap:Body>";
				data += "<FreeTextGeoCode xmlns='http://www.ip-assistance.pt/WS/GPS/'>";
				data += "<lcId>DBB031FBACB3</lcId>";
				data += "<lcCalle>"+lcCalle+"</lcCalle>";
				data += "<lnResultados>"+lnResultados+"</lnResultados>";
				data += "<lcApp>SIA</lcApp>";
				data += "</FreeTextGeoCode>";
				data += "</soap:Body>";
				data += "</soap:Envelope>";				
				
				var url = "https://www.ip-assistance.pt/ws/gpsg/gps.asmx";//注意是https				
				xmlHttp.open("post", url, true);
				xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
				xmlHttp.setRequestHeader("SOAPAction","http://www.ip-assistance.pt/WS/GPS/FreeTextGeoCode");
				xmlHttp.onreadystatechange = function () {
                    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                        var responseXML = xmlHttp.responseXML;
						var FreeTextGeoCodeResult = responseXML.getElementsByTagName("FreeTextGeoCodeResult")[0];
						var childNodes = FreeTextGeoCodeResult.childNodes;
						var length = childNodes.length;
						for(var i=0;i<length;i++){
							var stringNode = childNodes[i];
							var textNode = stringNode.firstChild;
							var str = textNode.data;
							textarea1.value += str + "\n";
						}
						console.log("FreeTextGeoCode Result:",responseXML);
                    }    
                }
				xmlHttp.send(data);
			}
		</script>
	</body>
</html>


需要注意的是,上文中所拼接的lcId的值是我随意写的,所以这个服务不能真正使用,要想使用需要向服务发布者申请一个key,此处只是假设我们已经获取了key为DBB031FBACB3,不过调用该服务的Ajax的代码逻辑确实是如上文所述,最后我们在回调函数的xmlHttp.responseXML中可以获取返回结果,具体如何解析就灵活多了。


更多相关文章
  • paip.软件版本完善计划VC423   1.speed 2.ini tray  tray trc4 = new tray(this, floatForm1);   ver kunlun   3.per thread try catch   verkunlun   4.program try cat ...
  • Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). 第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似. 实现动画有两种方式:一种使用XML文件(文件放在res/anim),一种直接代码 ...
  • 扫描器的使用 这里我使用x-scanner作为介绍对象,原因是x-scanner集成了多种扫描功能于一身,它可以采用多线程方式对指定IP地址段(或独立IP地址)进行安全漏洞扫描,提供了图形界面和命令行两种操作方式,扫描内容包括:标准端口状态及端口banner信息.CGI漏洞.RPC漏洞.SQL-SE ...
  • 在两英寸对角线的触摸屏上做浏览器听起来不像是什么好主意,但这并不能阻止 Opera 这一曾经出现在载人火箭和任天堂 DSL 游戏机上的浏览器染指更多设备.
  • AIX环境下安装sybase   软件环境: 操作系统:aix6.0 Sybase版本:12.5.0.0 补丁版本:12.5.0.3   实验:   一.安装sybase数据库 1.修改操作系统对文件大小.内存栈.数据段的限制(如前面已经修改过了,这部分核实一下即可): # vi /etc/secu ...
  • 获取IP的C++代码  我想在这里强烈指出程序员与脚本小子与装B者的区别:一个有天分的程序员,他在登陆系统的时候,不会去考虑自己的手指敲击在哪个建上,而是在考虑为什么敲击键盘能够登陆到操作系统中!!! 很详细的注释,所以不作评论 #include<stdio.h>#include< ...
一周排行
  •              首先看下UI效果:                这个是我在业余开发的浪新微博广场模块的一个实现页面左右滑动的效果,用到的有android.support.v4.view.ViewPager ...
  • 如果DHCP服务器操作系统是Winodws Server 2003,可以采用方法一.如果DHCP服务器操作系统是Winodws Server 2000,可以采用方法二. 方法一 1.在原来DHCP服务器中的命令提示符 ...
  • 百度师傅怎么用?无意间在浏览百度经验的时候,发现有个百度师傅的东西,具体就是上门服务进行电脑清灰,可以为自己的家人贴心的送上这样一份服务,下面分享百度师傅电脑清灰服务详细的预约教程 无意间在浏览百度经验的时候,发现有 ...
  • 在使用Spark进行分布式的应用,每次启动主机上面的服务都需要输入从机上的密码,太费事了,试着做了一下SSH无密码的配置,系统是Ubuntu 12.10. 首先需要生成公钥和私钥对,终端中输入命令. ssh-keyg ...
  • 近日,盛大游戏(GAME,NASDAQ)宣布,斥资8.115亿美元从母公司盛大网络受众收购为其提供用户支付平台服务的两家附属公司.由于该交易不被投资者看好,当天盛大游戏股价大跌20%.有投行人士对<每日经济新闻 ...
  • \begin{align*}\sum_{n=0}^{\infty}\frac{(n!)^{2}2^{n+1}}{(2n+1)!}&=\sum_{n=0}^{\infty}\int_{0}^{1}t^{n}(1 ...
  • 毫无疑问,如今最臭名昭著的网络犯罪和黑客团体就是所谓的“Anonymous(匿名)”.不论你是否赞同他们的理念和行为,都无法否认他们破坏网站,发动DoS攻击,中断企业正常运行,甚至针对公民个人进行威胁等一系列行为是违 ...
  • 21世纪经济报道 肖玫丽 广州报道7月18日,在首届"中国珠海智慧医疗研讨会"上,众联电商研究院发布了<2015年互联网医疗发展情况>研究报告,指出国内传统医疗服务存在五大痛点的前提下 ...
  • CodeIgniter是一个小巧但功能强大的 PHP 框架,官网地址. 在官网可以下载该框架. 下面来说明一下CodeIgniter中的简单操作. 一.Controller的创建与设置 1.在Controller目录 ...
  • 1.超链接访问过后hover样式就不出现的问题? 被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H-A 2.IE6的双倍边距BUG 例如: <styl ...