`

使用javascript调用webservice示例

    博客分类:
  • java
阅读更多
再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 代码
----------------------------------------------------------------------
function ajaxRequest()   
    {   
        var url = "http://localhost:88/webservicedemo.asmx";   
           
        //设置webService传入参数   
        //   
        //注意:   
        //   
        //    调用.Net 写的webservice(如例子中的webservicedemo.asmx)   
        //           HelloTo(String name)   针对name参数必须写成 <name></name>wqj,还有更多参数一样写,使用名称匹配   
        //           传入的参数数量可以不等于(多于或少于)方法要求的参数   
        //   
        //    调用java(xfire) 发布的webService   
        //           传入的参数必须与调用方法的参数数量相等,且按传入值的顺序进行匹配   
        //   
           
        var para = "<name></name>wqj"; 这里应该是一个标准的xml形式,源码贴出来时被虑掉了,请参看附件源码  
           
        var op = {   
                    data:para,   
                    onComplete: showResponse,   
                    onFailure:showError,   
                    update:'ajaxBack'   
                 };   
  
        var service = new WebService(url,"HelloTo",op);   
        service.request();   
        return false;   
    }   
    function showError(obj)   
    {   
        //obj 是一个xmlHttpRequest对象   
        alert("error");   
    }   
    function showResponse(requestText,requestXML)   
    {   
        //requestText 返回的文本   
        //requestXML 返回的XML   
        alert("ok");   
    }  

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

js 代码

  
var WSDLS = {};   
  
var WebService = new Class({   
  
    url : '',   
    method : '',   
    options:    
    {   
        method:'GET',   
        data: null,   
        update: null,   
        onComplete: Class.empty,   
        onError:Class.empty,   
        evalScripts: false,   
        evalResponse: false  
    },   
       
    initialize: function(url,method,options)   
    {   
        this.url = url;   
        this.method = method;   
        this.options = options;   
  
    },   
       
    request : function()   
    {   
        var wsdl = WSDLS[this.url];   
        if(!wsdl)    
        {   
            var op = {method:'GET',async: false};   
            var wsdlAjax = new XHR(op).send(this.url + "?wsdl", null);             
            wsdl = wsdlAjax.transport.responseXML;   
            WSDLS[this.url] = wsdl;   
        }   
        this.setSoap(wsdl);   
    },   
           
    setSoap : function(wsdl)   
    {   
           
        var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;   
        var sr =    
                "" +   
                ""
                "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/\">" +   
                "<soap:body>"</soap:body> +   
                "<" + this.method + " xmlns=\"" + ns + "\">" +   
                     (this.options.data === null ?"":this.options.data) +   
                " + this.method + ">;   
           
        this.options.method = 'post';   
        this.options.data = null;   
           
        var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + this.method;   
           
        var soapAjax = new Ajax(this.url,this.options);   
        soapAjax.setHeader("SOAPAction", soapaction);   
        soapAjax.setHeader("Content-type", "text/xml; charset=utf-8");   
        soapAjax.request(sr);   
    }   
       
});  

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

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 代码
var WSDLS = {};  
  
var WebService = new Class({  
  
    url : '',  
    method : '',  
    options:   
    {  
        method:'GET',  
        data: null,  
        update: null,  
        onComplete: Class.empty,  
        onError:Class.empty,  
        evalScripts: false,  
        evalResponse: false  
    },  
      
    initialize: function(url,method,options)  
    {         
        this.url = url;  
        this.method = method;  
        this.options = options;  
    },  
      
    request : function()  
    {  
        var wsdl = WSDLS[this.url];  
        if(!wsdl)   
        {  
            var op = {method:'GET',async: false};  
            var wsdlAjax = new XHR(op).send(this.url + "?wsdl", null);            
            wsdl = wsdlAjax.transport.responseXML;  
            WSDLS[this.url] = wsdl;  
        }  
  
        this.setSoap(wsdl);  
    },  
          
    setSoap : function(wsdl)  
    {  
        var paraXML = this.getParaXML(wsdl);  
        alert(paraXML);  
        var ns = (wsdl.documentElement.attributes["targetNamespace"] + "" == "undefined") ? wsdl.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : wsdl.documentElement.attributes["targetNamespace"].value;  
        var sr =   
                "" +  
                " +  
                "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/\">" +  
                "<soap:body>"</soap:body> +  
                "<" + this.method + " xmlns=\"" + ns + "\">" +  
                    paraXML  +  
                " + this.method + ">";  
          
        this.options.method = 'post';  
        this.options.data = null;  
          
        var soapaction = ((ns.lastIndexOf("/") != ns.length - 1) ? ns + "/" : ns) + this.method;  
  
        var soapAjax = new Ajax(this.url,this.options);  
        soapAjax.setHeader("SOAPAction", soapaction);  
        soapAjax.setHeader("Content-type", "text/xml; charset=utf-8");  
        soapAjax.request(sr);   
    },  
    getParaXML : function(wsdl)  
    {  
          
        var objNode = null;  
        var rtnValue = "";  
        //java(xfire)  
        var ell = this.getElementsByTagName(wsdl,"xsd:element");      
        if(ell.length == 0)   
        {  
            //c#  
            ell = this.getElementsByTagName(wsdl,"s:element");    
        }  
        for(var i = 0; i < ell.length; i++)  
        {  
            if(this.getElementAttrValue(ell[i],"name") == this.method)  
            {  
                objNode = ell[i];  
                break;  
            }  
        }  
  
        if(objNode == null) return rtnValue;  
        //java(xfire)  
        ell = this.getElementsByTagName(objNode,"xsd:element");   
        if(ell.length == 0)   
        {  
            //c#  
            ell = this.getElementsByTagName(objNode,"s:element");  
        }  
        if(ell.length == 0) return rtnValue ;  
          
        var hash = new Hash();  
          
        if(this.options.data != null && this.options.data.clean != "")  
        {  
            hash = this.options.data.split("&").toHash("=");  
        }  
          
        for(var i = 0; i < ell.length; i++)  
        {  
            var paraName = this.getElementAttrValue(ell[i],"name");  
            rtnValue = rtnValue + this.getSingleXML(paraName,hash);  
        }  
          
        return rtnValue;  
    },  
      
    getSingleXML : function (name,hash)  
    {  
        name = name.trim();  
          
        var rtnValue = "";  
        if(hash.hasKey(name))  
        {  
            rtnValue = hash.get(name);  
        }  
        rtnValue = "<" + name + ">" + xmlscc(rtnValue) + " + name + ">"  
        return rtnValue;  
    },  
    getBackData: function(xml)  
    {  
        var rtnValue = "";  
        //java(xfire)  
        var soap = this.getElementsByTagName(xml,"ns1:out");      
        if(soap.length == 0)  
        {  
            //c#  
            soap = this.getElementsByTagName(xml,this.method + "Result");  
        }  
        return soap[0].childNodes[0].nodeValue;       
          
    },  
    getElementsByTagName : function(objNode,tagName)  
    {  
        //tagName 形式如 xsd:element ,写出tag的全称  
  
        var ell;  
        if(this.isIE())  
        {  
            ell = objNode.getElementsByTagName(tagName);      
        }  
        else  
        {  
            if(tagName.contains(":")) tagName = tagName.split(":")[1];  
            ell = objNode.getElementsByTagName(tagName);           
        }  
        return ell;  
    },  
    getElementAttrValue : function(objNode,attrName)  
    {  
        var rtnValue = "";  
          
        if(objNode == null) return rtnValue;  
          
        if(objNode.attributes[attrName] + "" == "undefined")  
        {   
            if(objNode.attributes.getNamedItem(attrName) != null)  
                rtnValue = objNode.attributes.getNamedItem(attrName).nodeValue ;  
              
        }  
        else  
        {  
            if(objNode.attributes[attrName] != null)  
                rtnValue = objNode.attributes[attrName].value;  
        }  
        return rtnValue;  
    },  
    isIE : function()  
    {  
        var isMSIE = /*@cc_on!@*/false;  
        return isMSIE;  
    }  
});  
  
Array.extend({  
      
    toHash : function (splitChar)  
    {  
        var hash = new Hash({});  
        for(var i=0;i<this.length;i++)  
        {  
              
            if(this[i].split(splitChar).length == 1) contrnue;  
  
            var key = this[i].split(splitChar)[0].trim();  
            var value = this[i].split(splitChar)[1].trim();  
              
            hash.set(key, value);  
        }  
          
        return hash;  
    }  
});  
  
function xmlscc(strData)  
{  
  
    strData=strData.replace(/&/g, "&");  
    strData=strData.replace(/>/g, ">");  
    strData=strData.replace(/"<");  
    strData=strData.replace(/"/g, """); 
    strData=strData.replace(/'/g, "'");  
    return strData;  
}  
相应的调用代码如下:



js 代码

<script type=< span="">"text/javascript">  
      
    var service ;  
    function ajaxRequest()  
    {  
        var url = "http://localhost:88/webservicedemo.asmx";  
          
        //设置webService传入参数  
        //  
        //注意:  
        //  
        //    调用webservice(如例子中的webservicedemo.asmx)  
        //           HelloTo(String name)   针对name参数必须写成name=wqj ,还有更多参数一样写,使用&符号分隔(name=11&age=20&.....),使用名称匹配  
        //           传入的参数数量可以不等于(多于或少于)方法要求的参数  
          
          
        var para = "name=wqj";  
          
        var op = {  
                    data:para,  
                    onComplete: showResponse,  
                    onFailure:showError,  
                    update:'ajaxBack'  
                 };  
  
        service = new WebService(url,"HelloTo",op);  
        service.request();  
        return false;  
    }  
    function showError(obj)  
    {  
        //obj 是一个xmlHttpRequest对象  
        alert("error");  
    }  
    function showResponse(requestText,requestXML)  
    {  
        //requestText 返回的文本  
        //requestXML 返回的XML  
        // service.getBackData 就是取出返回的XML中,实际需要的数据  
        //经过测试兼容 IE,FF  
        alert(service.getBackData(requestXML));  
          
    }  
    </script>  




----------------------------------------------------------------------



JavaScriptSOAP.rar (47.1 KB)
描述: js调用webservice示例

JavaScriptSOAP(V2).rar (49.5 KB)
描述: js,sope第二版
0
0
分享到:
评论
1 楼 Hafeyang 2010-12-01  
由于使用的是XmlHttpRequest对象,会有跨域不能访问问题。用iframe应该解决这个问题。

相关推荐

    使用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服务进行交互,实现异步数据传输,提高用户体验...

    js调用webservice示例+源码

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

    使用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方法的...

    使用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