如何使用Javascript

时间:2016-06-15 17:00:43

标签: javascript xml web-services xpath soap

我使用Javascript调用SOAP Web服务。使用firebug,我可以看到请求成功,我看到了XML SOAP响应。

如何在网页上显示回复?甚至更好 - 如何在XML SOAP响应中显示单个节点?我想也许我可以使用XPath - 但它似乎并没有起作用。

这是我的代码:

<html>
<head>
    <title>SOAP Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'https://mysoapurl.com', true);

            // build SOAP request
            var sr =
                '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<s:Header> ' +
                        '<USERNAME xmlns="http://www.tempuri.org">MyUsername</USERNAME>' +
                        '<PASSWORD xmlns="http://www.tempuri.org">MyPassword</PASSWORD>' +
                    '</s:Header>' +
                    '<s:Body>' +
                        '<GetData>Foo</GetData>' +
                    '</s:Body>' +
                '</s:Envelope>';            


            // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.setRequestHeader('SOAPAction', 'http://tempuri.org/MySoapActionURL');
            xmlhttp.send(sr);
            // send request
            // ...


            // This XPath query should get us the <GetResponse> element from the SOAP XML Response 
            var query = "//ns1:GetResponse[1]"; 

            // This object defines the namespaces used in the query 
            var namespaceMapping = { 
            ns1:  "http://tempuri.org/",  // SOAP namespace 
            diffgr: "urn:schemas-microsoft-com" // the service-specific namespace 
            }; 

            // Extract the <GetResponse> element from the response document 
            var responseNode=XML.getNode(XMLHttpRequest.responseXML, query, namespaceMapping);

            return responseNode;

        }

            window.onload = soap;

    </script>
</head>
<body>
</body>
<html>

非常感谢任何帮助。谢谢你的期待。

1 个答案:

答案 0 :(得分:0)

您可以使用evaluate上的responseXML方法:

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open('POST', 'https://mysoapurl.com', true);

        // build SOAP request
        var sr =
            '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                '<s:Header> ' +
                    '<USERNAME xmlns="http://www.tempuri.org">MyUsername</USERNAME>' +
                    '<PASSWORD xmlns="http://www.tempuri.org">MyPassword</PASSWORD>' +
                '</s:Header>' +
                '<s:Body>' +
                    '<GetData>Foo</GetData>' +
                '</s:Body>' +
            '</s:Envelope>';            


        // Send the POST request
        xmlhttp.setRequestHeader('Content-Type', 'text/xml');
        xmlhttp.setRequestHeader('SOAPAction', 'http://tempuri.org/MySoapActionURL');
        xmlhttp.onload = function(evt) {
          var doc = this.responseXML;
          var namespaceMapping = { 
            ns1:  "http://tempuri.org/",   
            diffgr: "urn:schemas-microsoft-com" 
          }; 
          var node = doc.evaluate('//ns1:GetResponse[1]', doc, 
             function (prefix) {
               return namespaceMapping[prefix];
             },
             XPathResult.FIRST_ORDERED_NODE_TYPE,
             null).singleNodeValue;
          if (node != null) {
            // now access node.textContent respectively run further queries on node
          }
        };
        xmlhttp.send(sr);