创建JavaScript SOAP客户端

时间:2015-04-01 09:40:29

标签: java web-services soap

我正在用JS创建一个SOAP客户端,这是我第一次使用webServices,我的代码中必须有几个错误。

poit是,我的代码,我无法访问WebService,但我不知道如何访问内部的方法。所以webservice给了我以下响应:

<h1>Version</h1>
<p>Hi there, this is an AXIS service!</p>
<i>Perhaps there will be a form for invoking the service here...</i>

而不是我正在调用的方法的正确XML。

这是我的SOAP客户端的代码:

<html>

<script type="text/javascript">

    function run(){

        var objXMLHttpRequest = new XMLHttpRequest();
        objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/Version?wdsl/", true);
        objXMLHttpRequest.onreadystatechange = function () {
        //alert(objXMLHttpRequest.readyState+"   "+ objXMLHttpRequest.status);
        if (objXMLHttpRequest.readyState == 4 && objXMLHttpRequest.status == 200) {
            result = objXMLHttpRequest.responseXML;
            alert(objXMLHttpRequest.responseText);
            alert(objXMLHttpRequest.responseXML);
          }
        }
        objXMLHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

        var packet = '<?xml version="1.0" encoding="utf-8" ?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getVersion xmlns="http://service.web.com.crunchify/"></getVersion></soap:Body></soap:Envelope>';

        objXMLHttpRequest.send(packet);
        // Add mentioned below code only if your application calls webservice synchronously. Otherwise use "onreadystatechange" process response.
        response = objXMLHttpRequest.responseXML;
        alert(objXMLHttpRequest.responseText+ "  "+ response);
    }
</script>

<head>
</head>
<body>
    <button  onclick="run()">Dale!</button>
</body>
</html>

我认为这个问题应该存在,但正如我所说,这是我的第一次,而且我不知道自己在做什么。

解决

2 个答案:

答案 0 :(得分:0)

第一个问题可能出在这一行:

objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/Version?wdsl/", true);

这个网址 http://localhost:8080/CrunchifyWS/services/Version?wsdl 为您提供可以拨打的服务列表。

所以你可能会有类似的东西:

objXMLHttpRequest.open("GET", "http://localhost:8080/CrunchifyWS/services/myServiceMethod", true);

这是我认为的第一个问题。 第二次,您必须发送参数,而不是整个肥皂信封。

var packet = '<?xml version="1.0" encoding="utf-8" ?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getVersion xmlns="http://service.web.com.crunchify/"></getVersion></soap:Body></soap:Envelope>';

objXMLHttpRequest.send(packet);

喜欢:

var parameters = "param1=15&param2=30"
objXMLHttpRequest.send(parameters);

方法发送应该是 objXMLHttpRequest.onreadystatechange = function(){}

这个函数是一个回调来检查响应。

不要犹豫,看看这个链接: http://www.w3schools.com/xml/xml_dtd.asp

希望这个帮助

答案 1 :(得分:0)

您可以查看答案演变的评论,但简而言之:

1)SOAP方法调用需要使用HTTP方法“POST”,因此GET操作是第一个问题。

2)在SOAP 1.1中,服务器需要SOAPAction头来知道您尝试调用哪种方法。当使用“document literal wrapped”方法时,这并不是绝对必要的,并且许多SOAP 1.1服务器实际上接受空SOAP操作,因为它们可以根据请求的根标记找到方法,从而提供与SOAP 1.2的一些向前兼容性。 / p>

但是,严格的SOAP 1.1服务器需要正确发送SOAPAction标头:

objXMLHttpRequest.setRequestHeader("SOAPAction", "mySoapAction");

您可以在Web服务的原始WSDL中为您尝试调用的方法找到相应的SOAPAction。