`

使用javascript调用webservice示例

阅读更多

再javascript中使用soap调用webservice的示例代码

代码再IE6和FF测试通过,对于c#写的webservice和java(xfire)写的,都测试过,没有问题

此代码原型来源于 http://www.guru4.net/ 的javascript soapclient

发现这个下载的js只能用于调用c#的webservice,所以利用mootools,重新封装,达到IE和火狐的兼容的同时,兼容java和c#

(再例子中使用的 mootools.v1.11.js 文件,做过修改)

客户端js调用代码如下

js 代码
 
  1. function ajaxRequest()   
  2.     {   
  3.         var url = "http://localhost:88/webservicedemo.asmx";   
  4.            
  5.         //设置webService传入参数   
  6.         //   
  7.         //注意:   
  8.         //   
  9.         //    调用.Net 写的webservice(如例子中的webservicedemo.asmx)   
  10.         //           HelloTo(String name)   针对name参数必须写成 <name></name>wqj,还有更多参数一样写,使用名称匹配   
  11.         //           传入的参数数量可以不等于(多于或少于)方法要求的参数   
  12.         //   
  13.         //    调用java(xfire) 发布的webService   
  14.         //           传入的参数必须与调用方法的参数数量相等,且按传入值的顺序进行匹配   
  15.         //   
  16.            
  17.         var para = "<name></name>wqj"; 这里应该是一个标准的xml形式,源码贴出来时被虑掉了,请参看附件源码  
  18.            
  19.         var op = {   
  20.                     data:para,   
  21.                     onComplete: showResponse,   
  22.                     onFailure:showError,   
  23.                     update:'ajaxBack'   
  24.                  };   
  25.   
  26.         var service = new WebService(url,"HelloTo",op);   
  27.         service.request();   
  28.         return false;   
  29.     }   
  30.     function showError(obj)   
  31.     {   
  32.         //obj 是一个xmlHttpRequest对象   
  33.         alert("error");   
  34.     }   
  35.     function showResponse(requestText,requestXML)   
  36.     {   
  37.         //requestText 返回的文本   
  38.         //requestXML 返回的XML   
  39.         alert("ok");   
  40.     }  

WebService类的代码如下(webservice.js)

js 代码
 
  1.   
  2. var WSDLS = {};   
  3.   
  4. var WebService = new Class({   
  5.   
  6.     url : '',   
  7.     method : '',   
  8.     options:    
  9.     {   
  10.         method:'GET',   
  11.         data: null,   
  12.         update: null,   
  13.         onComplete: Class.empty,   
  14.         onError:Class.empty,   
  15.         evalScripts: false,   
  16.         evalResponse: false  
  17.     },   
  18.        
  19.     initialize: function(url,method,options)   
  20.     {   
  21.         this.url = url;   
  22.         this.method = method;   
  23.         this.options = options;   
  24.   
  25.     },   
  26.        
  27.     request : function()   
  28.     {   
  29.         var wsdl = WSDLS[this.url];   
  30.         if(!wsdl)    
  31.         {   
  32.             var op = {method:'GET',async: false};   
  33.             var wsdlAjax = new XHR(op).send(this.url + "?wsdl"null);             
  34.             wsdl = wsdlAjax.transport.responseXML;   
  35.             WSDLS[this.url] = wsdl;   
  36.         }   
  37.         this.setSoap(wsdl);   
  38.     },   
  39.            
  40.     setSoap : function(wsdl)   
  41.     {   
  42.            
  43.         var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;   
  44.         var sr =    
  45.                 "<!---->" +   
  46.                 ""
  47.                 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +   
  48.                 "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +   
  49.                 "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +   
  50.                 "<soap:body>"</soap:body> +   
  51.                 "<" + this.method + " xmlns=\"" + ns + "\">" +   
  52.                      (this.options.data === null ?"":this.options.data) +   
  53.                 " + this.method + ">;   
  54.            
  55.         this.options.method = 'post';   
  56.         this.options.data = null;   
  57.            
  58.         var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + this.method;   
  59.            
  60.         var soapAjax = new Ajax(this.url,this.options);   
  61.         soapAjax.setHeader("SOAPAction", soapaction);   
  62.         soapAjax.setHeader("Content-type""text/xml; charset=utf-8");   
  63.         soapAjax.request(sr);   
  64.     }   
  65.        
  66. });  

 在第一个版本中存在以下问题

1. 不能根据webservice的要求输入参数自动组织参数

2. 没有处理返回值

3.一旦webservice调用过程出错,会形成一个死循环(一直弹出error)


V2 说明

1. 解决第一版中死循环的问题

2. 统一输入参数的传入形式(与mootools的ajax使用方式完全一致),形式如name=wqj&age=20&........

3. 自动根据参数名对应的值,组织webservice的传入参数,只根据webservice要求的参数名查找对应的值

    与顺序不再有关系.(对于xfire中的输入参数使用名称 in0,in1........)

    传入的参数数量也不再要求一致,多的自动丢弃,少的自动传空

4. 对于返回的XML,增加提取方法,返回需要的关键返回值(去掉XML的框框)

详细参照附件源码,下面是部分关键代码


WebService类的代码如下(webservice.js)

js 代码
  1. var WSDLS = {};  
  2.   
  3. var WebService = new Class({  
  4.   
  5.     url : '',  
  6.     method : '',  
  7.     options:   
  8.     {  
  9.         method:'GET',  
  10.         data: null,  
  11.         update: null,  
  12.         onComplete: Class.empty,  
  13.         onError:Class.empty,  
  14.         evalScripts: false,  
  15.         evalResponse: false  
  16.     },  
  17.       
  18.     initialize: function(url,method,options)  
  19.     {         
  20.         this.url = url;  
  21.         this.method = method;  
  22.         this.options = options;  
  23.     },  
  24.       
  25.     request : function()  
  26.     {  
  27.         var wsdl = WSDLS[this.url];  
  28.         if(!wsdl)   
  29.         {  
  30.             var op = {method:'GET',async: false};  
  31.             var wsdlAjax = new XHR(op).send(this.url + "?wsdl"null);            
  32.             wsdl = wsdlAjax.transport.responseXML;  
  33.             WSDLS[this.url] = wsdl;  
  34.         }  
  35.   
  36.         this.setSoap(wsdl);  
  37.     },  
  38.           
  39.     setSoap : function(wsdl)  
  40.     {  
  41.         var paraXML = this.getParaXML(wsdl);  
  42.         alert(paraXML);  
  43.         var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;  
  44.         var sr =   
  45.                 "" +  
  46.                 " +  
  47.                 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +  
  48.                 "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +  
  49.                 "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +  
  50.                 "<soap:body>"</soap:body> +  
  51.                 "<" + this.method + " xmlns=\"" + ns + "\">" +  
  52.                     paraXML  +  
  53.                 "<!----> + this.method + ">";  
  54.           
  55.         this.options.method = 'post';  
  56.         this.options.data = null;  
  57.           
  58.         var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + this.method;  
  59.   
  60.         var soapAjax = new Ajax(this.url,this.options);  
  61.         soapAjax.setHeader("SOAPAction", soapaction);  
  62.         soapAjax.setHeader("Content-type""text/xml; charset=utf-8");  
  63.         soapAjax.request(sr);   
  64.     },  
  65.     getParaXML : function(wsdl)  
  66.     {  
  67.           
  68.         var objNode = null;  
  69.         var rtnValue = "";  
  70.         //java(xfire)  
  71.         var ell = this.getElementsByTagName(wsdl,"xsd:element");      
  72.         if(ell.length == 0)   
  73.         {  
  74.             //c#  
  75.             ell = this.getElementsByTagName(wsdl,"s:element");    
  76.         }  
  77.         for(var i = 0; i < ell.length; i++)  
  78.         {  
  79.             if(this.getElementAttrValue(ell[i],"name") == this.method)  
  80.             {  
  81.                 objNode = ell[i];  
  82.                 break;  
  83.             }  
  84.         }  
  85.   
  86.         if(objNode == nullreturn rtnValue;  
  87.         //java(xfire)  
  88.         ell = this.getElementsByTagName(objNode,"xsd:element");   
  89.         if(ell.length == 0)   
  90.         {  
  91.             //c#  
  92.             ell = this.getElementsByTagName(objNode,"s:element");  
  93.         }  
  94.         if(ell.length == 0) return rtnValue ;  
  95.           
  96.         var hash = new Hash();  
  97.           
  98.         if(this.options.data != null && this.options.data.clean != "")  
  99.         {  
  100.             hash = this.options.data.split("&").toHash("=");  
  101.         }  
  102.           
  103.         for(var i = 0; i < ell.length; i++)  
  104.         {  
  105.             var paraName = this.getElementAttrValue(ell[i],"name");  
  106.             rtnValue = rtnValue + this.getSingleXML(paraName,hash);  
  107.         }  
  108.           
  109.         return rtnValue;  
  110.     },  
  111.       
  112.     getSingleXML : function (name,hash)  
  113.     {  
  114.         name = name.trim();  
  115.           
  116.         var rtnValue = "";  
  117.         if(hash.hasKey(name))  
  118.         {  
  119.             rtnValue = hash.get(name);  
  120.         }  
  121.         rtnValue = "<" + name + ">" + xmlscc(rtnValue) + "<!----> + name + ">"  
  122.         return rtnValue;  
  123.     },  
  124.     getBackData: function(xml)  
  125.     {  
  126.         var rtnValue = "";  
  127.         //java(xfire)  
  128.         var soap = this.getElementsByTagName(xml,"ns1:out");      
  129.         if(soap.length == 0)  
  130.         {  
  131.             //c#  
  132.             soap = this.getElementsByTagName(xml,this.method + "Result");  
  133.         }  
  134.         return soap[0].childNodes[0].nodeValue;       
  135.           
  136.     },  
  137.     getElementsByTagName : function(objNode,tagName)  
  138.     {  
  139.         //tagName 形式如 xsd:element ,写出tag的全称  
  140.   
  141.         var ell;  
  142.         if(this.isIE())  
  143.         {  
  144.             ell = objNode.getElementsByTagName(tagName);      
  145.         }  
  146.         else  
  147.         {  
  148.             if(tagName.contains(":")) tagName = tagName.split(":")[1];  
  149.             ell = objNode.getElementsByTagName(tagName);           
  150.         }  
  151.         return ell;  
  152.     },  
  153.     getElementAttrValue : function(objNode,attrName)  
  154.     {  
  155.         var rtnValue = "";  
  156.           
  157.         if(objNode == nullreturn rtnValue;  
  158.           
  159.         if(objNode.attributes[attrName] + "" == "undefined")  
  160.         {   
  161.             if(objNode.attributes.getNamedItem(attrName) != null)  
  162.                 rtnValue = objNode.attributes.getNamedItem(attrName).nodeValue ;  
  163.               
  164.         }  
  165.         else  
  166.         {  
  167.             if(objNode.attributes[attrName] != null)  
  168.                 rtnValue = objNode.attributes[attrName].value;  
  169.         }  
  170.         return rtnValue;  
  171.     },  
  172.     isIE : function()  
  173.     {  
  174.         var isMSIE = /*@cc_on!@*/false;  
  175.         return isMSIE;  
  176.     }  
  177. });  
  178.   
  179. Array.extend({  
  180.       
  181.     toHash : function (splitChar)  
  182.     {  
  183.         var hash = new Hash({});  
  184.         for(var i=0;i<this.length;i++)  
  185.         {  
  186.               
  187.             if(this[i].split(splitChar).length == 1) contrnue;  
  188.   
  189.             var key = this[i].split(splitChar)[0].trim();  
  190.             var value = this[i].split(splitChar)[1].trim();  
  191.               
  192.             hash.set(key, value);  
  193.         }  
  194.           
  195.         return hash;  
  196.     }  
  197. });  
  198.   
  199. function xmlscc(strData)  
  200. {  
  201.   
  202.     strData=strData.replace(/&/g, "&");  
  203.     strData=strData.replace(/>/g, ">");  
  204.     strData=strData.replace(/"<");  
  205.     strData=strData.replace(/"/g, """); 
  206.     strData=strData.replace(/'/g, "'");  
  207.     return strData;  
  208. }  
相应的调用代码如下:

 

js 代码
 
  1. <script type=< span="">"text/javascript">  
  2.       
  3.     var service ;  
  4.     function ajaxRequest()  
  5.     {  
  6.         var url = "http://localhost:88/webservicedemo.asmx";  
  7.           
  8.         //设置webService传入参数  
  9.         //  
  10.         //注意:  
  11.         //  
  12.         //    调用webservice(如例子中的webservicedemo.asmx)  
  13.         //           HelloTo(String name)   针对name参数必须写成name=wqj ,还有更多参数一样写,使用&符号分隔(name=11&age=20&.....),使用名称匹配  
  14.         //           传入的参数数量可以不等于(多于或少于)方法要求的参数  
  15.           
  16.           
  17.         var para = "name=wqj";  
  18.           
  19.         var op = {  
  20.                     data:para,  
  21.                     onComplete: showResponse,  
  22.                     onFailure:showError,  
  23.                     update:'ajaxBack'  
  24.                  };  
  25.   
  26.         service = new WebService(url,"HelloTo",op);  
  27.         service.request();  
  28.         return false;  
  29.     }  
  30.     function showError(obj)  
  31.     {  
  32.         //obj 是一个xmlHttpRequest对象  
  33.         alert("error");  
  34.     }  
  35.     function showResponse(requestText,requestXML)  
  36.     {  
  37.         //requestText 返回的文本  
  38.         //requestXML 返回的XML  
  39.         // service.getBackData 就是取出返回的XML中,实际需要的数据  
  40.         //经过测试兼容 IE,FF  
  41.         alert(service.getBackData(requestXML));  
  42.           
  43.     }  
  44.     </script>  




 

分享到:
评论
16 楼 up2vs 2007-11-19  
Webservice一般是应用的跨域共享。在一个域了产生调用的几率应该很小。
及时用一些跨域手段实现调用,效率应该也会受到影响。
我暂时还想不出在什么应用里面用ajax直接调用webservice有什么优势和便利。
15 楼 pignut_wang 2007-11-17  
非常感谢楼上的朋友分享你的修改.
最近因为工作的关系,少上网了,没有及时回复,还请谅解.
14 楼 yza0088 2007-11-13  
继续修改:有时我们传递的参数可能是一段HTML,这样的话如果采用楼主的方法。那么无论采用什么分割符传递的HTML片段都可能被截断。
因此options.data直接传递Hash
修改代码如下:
//		var hash = new Hash(); 
		
//		if(this.options.data != null && this.options.data.clean != "")
//		{
//			hash = this.options.data.split("&").toHash(" = "); //Edit by:yza 2007/11/13
//		}
		
//		for(var i = 0; i < ell.length; i++)
//		{
//			var paraName = this.getElementAttrValue(ell[i],"name");
//			rtnValue = rtnValue + this.getSingleXML(paraName,hash);
//		}

      	for(var i = 0; i < ell.length; i++)
		{
			var paraName = this.getElementAttrValue(ell[i],"name");
			rtnValue = rtnValue + this.getSingleXML(paraName,this.options.data);
		}
13 楼 yza0088 2007-11-13  
最近有个项目正好用上楼主的js封装,这里谢过!
但我发现当传递html字符串的时候,会有截断现象。
因此做了以下修改:

hash = this.options.data.split("&").toHash(" = ");


"="两边加了空格,这样当参数为xml或html串时就不会有问题了。
但在拼data时可千万记得用" = "而不是"="
12 楼 afcn0 2007-10-24  
跨域不麻烦,甚至更简单,script tag回调函数比XHR还简单
11 楼 gazhangting 2007-10-24  
用javascript联webservice没什么意义,因为脚本不能跨域访问,就算勉强可以实现,也很麻烦.而用webservice要意义就是要跨平台,跨域.以前也用AJAX连过,可以后来发现一点意义也没有
10 楼 pignut_wang 2007-10-23  
kidfang  
这个怎么调用,点"执行"按钮报错?

确认一下,你的webservice地址是不是
http://localhost:88/webservicedemo.asmx

还句话说,通过这个url,是不是能访问到?
我觉得应该就是这个问题
9 楼 hideto 2007-10-19  
用Jester调用REST Web Service比简单不少
8 楼 kidfang 2007-10-19  
这个怎么调用,点"执行"按钮报错?
7 楼 williamy 2007-10-11  
请问和ajax比有什么优势,不明白其动机
6 楼 bladechan 2007-08-24  
厉害,谢谢
5 楼 pignut_wang 2007-08-08  
不同的技术有不同的用途嘛
4 楼 carmansky 2007-08-07  
WebService就是不能上传太大的文件.当然WebService主要是用来集成的..
顶之.
3 楼 network-eagle 2007-08-03  
学习了。.js 的功能能做到这么强大呀...研究研究...
2 楼 pignut_wang 2007-07-27  
神奇?
应该说是通用,呵呵
1 楼 shmilyLT 2007-07-26  
好神奇,最近正好在搞webService

相关推荐

    使用javascript调用webservice示例.pdf

    在本文中,我们将深入探讨如何使用JavaScript调用Web服务,特别是SOAP Web服务。JavaScript是一种广泛应用于客户端浏览器的脚本语言,它可以用来与服务器进行交互,包括调用Web服务以获取或发送数据。以下是一个示例...

    使用javascript调用webservice示例归类.pdf

    JavaScript调用WebService是一种常见的在客户端与服务器之间进行通信的方式,特别是在Web应用程序中。在这个示例中,我们将讨论如何使用JavaScript来调用不同平台(如C#和Java)编写的WebService,以及实现跨浏览器...

    使用javascript调用webservice示例[借鉴].pdf

    在本文中,我们将深入探讨如何使用JavaScript调用Web服务,特别是SOAP Web Service。JavaScript是一种广泛应用于客户端Web开发的脚本语言,它允许我们与服务器端的Web服务进行交互,实现异步数据传输,提高用户体验...

    使用JavaScript调用WebService的示例

    本篇将深入探讨如何使用JavaScript调用WebService,帮助开发者理解和掌握这一技术。 首先,了解WebService的基本概念。WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的应用程序接口(API),允许不同...

    Js调用webService示例

    本示例旨在详细介绍如何使用JavaScript调用WebService,以及涉及的相关知识点。 首先,我们需要理解什么是WebService。WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的,可以通过网络进行通信的软件服务。它...

    JavaScript调用WebService实例总结

    JavaScript调用WebService是一种常见的在客户端与服务器之间进行数据交互的方式,尤其在Web应用程序中,它允许JavaScript代码直接访问Web服务提供的功能。以下是对这个实例的详细解析和相关知识点的总结: 1. ...

    Javascript调用WebService

    使用javascript 中Ajax技术调用WebService,包括JSP和ASP.NET中两种,其中JSP的WebService使用了XFire框架。 ASP.NET中的WebService做了一个方法示例GetProgress,包含3个参数。 JSP中的WebService做了hello方法的...

    js调用webservice示例+源码

    本文将深入探讨如何使用JavaScript调用Web Service,以及如何解决在这个过程中遇到的问题,以配合“js调用webservice示例+源码”的主题。 Web Service是一种基于网络的、平台无关的服务,它通过SOAP(Simple Object...

    使用javascript调用webservice

    JavaScript调用Web Service是一种在客户端通过JavaScript代码与服务器端的Web Service进行交互的技术。Web Service是一种基于SOA(Service-Oriented Architecture,面向服务架构)的设计理念,它允许不同的系统之间...

    ajax和JavaScript分别调用Webservice实例

    通过深入学习这三个示例,你可以熟练掌握Ajax和JavaScript调用WebService的基本方法,这对于开发实时交互的Web应用具有极大的价值。实践这些实例,将有助于你更好地理解和运用这些技术,提升你的Web开发技能。

    JS调用WebService示例

    JavaScript调用WebService是一种跨语言的调用方式,允许使用JavaScript语言的前端页面能够调用后端基于C#等其他编程语言编写的WebService服务。WebService是一种独立于平台和编程语言的服务,常用的通信协议是SOAP...

    Jquery调用WebService示例方法(源代码)

    本示例将深入探讨如何使用jQuery来调用WebService,通过源代码解析相关知识点。 首先,了解jQuery的核心功能对理解jQuery调用WebService至关重要。jQuery提供了`$.ajax()`函数,它是进行异步数据请求的基础。在这个...

    用JavaScript调用WebService的示例

    ### 使用JavaScript调用WebService的方法与实例 随着互联网技术的发展,跨平台、跨语言的数据交互变得越来越重要。在众多实现方式中,使用JavaScript调用WebService是一种常见的解决方案。本文将基于提供的标题“用...

    jQuery使用Ajax方法调用WebService.doc

    本文将详细介绍如何使用jQuery的Ajax方法来调用WebService,并通过具体的示例代码来阐述其工作原理及实践应用。 #### 二、基础知识 在深入探讨之前,我们先了解一下基础概念: 1. **Ajax**:一种在无需重新加载整个...

    MVC调用webService

    "MvcAndAjax"这个文件名可能代表了一个包含MVC项目和相关的JavaScript文件的示例,用于演示如何在MVC应用中使用AJAX调用WebService。在这个项目中,你可能会找到一个控制器、视图以及用于调用WebService的...

    几种调用WebService的方法

    #### 使用JavaScript调用WebService 给定的部分内容展示了一种使用JavaScript来调用WebService的方法。此方法主要依赖于`Microsoft.XMLHTTP`对象,这是一个用于发送HTTP请求并接收响应的对象,通常在客户端脚本中...

    js调用webService组件

    综上所述,JavaScript调用WebService涉及到的主要知识点包括:XMLHttpRequest对象的使用、SOAP消息的构造、跨域请求的处理以及响应数据的解析和处理。在实际项目中,理解这些概念和技术将有助于你更有效地实现客户端...

    JS调用WebService源码

    本压缩包包含了一个简单的示例项目——"WebApplication1",用于演示如何使用JavaScript调用WebService。 在JavaScript中,调用WebService通常涉及到XMLHttpRequest对象或更现代的fetch API。以下是一些关键知识点:...

Global site tag (gtag.js) - Google Analytics