最简单的 SOAP 示例

IT技术 javascript soap
2021-01-20 13:48:40

使用 Javascript 的最简单的 SOAP 示例是什么?

为了尽可能有用,答案应该:

  • 具有功能性(换句话说,实际工作)
  • 至少发送一个可以在代码其他地方设置的参数
  • 处理至少一个可以在代码其他地方读取的结果值
  • 使用大多数现代浏览器版本
  • 尽可能清晰和简短,不使用外部库
6个回答

这是我可以创建的最简单的 JavaScript SOAP 客户端。

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

            // build SOAP request
            var sr =
                '<?xml version="1.0" encoding="utf-8"?>' +
                '<soapenv:Envelope ' + 
                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                    'xmlns:api="http://127.0.0.1/Integrics/Enswitch/API" ' +
                    'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
                    'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<soapenv:Body>' +
                        '<api:some_api_call soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' +
                            '<username xsi:type="xsd:string">login_username</username>' +
                            '<password xsi:type="xsd:string">password</password>' +
                        '</api:some_api_call>' +
                    '</soapenv:Body>' +
                '</soapenv:Envelope>';

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) {
                    if (xmlhttp.status == 200) {
                        alert(xmlhttp.responseText);
                        // alert('done. use firebug/console to see network response');
                    }
                }
            }
            // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.send(sr);
            // send request
            // ...
        }
    </script>
</head>
<body>
    <form name="Demo" action="" method="post">
        <div>
            <input type="button" value="Soap" onclick="soap();" />
        </div>
    </form>
</body>
</html> <!-- typo -->
@Rickchip,这里有一个更通用的方法来解决您的问题:可以setRequestHeader()在需要时通过调用添加标题
2021-03-15 13:48:40
发送 <soapenv:Header> 怎么样?我尝试将我的标头标签构建到 sr 变量中,但是服务器收到了一个空的 soapenv:Header
2021-04-02 13:48:40
我正在为 android/ios 用 nativescript 开发跨平台应用程序。我想使用 SOAP 网络服务。请指导我。我将上面的代码用于 SOAP 请求 & 我想要 SOAP 响应格式,如何处理响应。请查看我的问题 - stackoverflow.com/questions/37745840/...
2021-04-03 13:48:40
最近不得不使用它来支持遗留代码。遇到一个缺少标头的问题,该问题导致“在 EndpointDispatcher 处创建了“ContractFilter 不匹配”。xmlhttp.setRequestHeader('SOAPAction', 'http://myurl.com/action');xmlhttp.send(sr)修复它之前添加
2021-04-03 13:48:40
这对我有用!(在用真实 URL 替换 SOAP 服务 URL 并关闭浏览器上的跨域限制之后,正如@Prestaul 所暗示的那样)
2021-04-08 13:48:40

浏览器处理 XMLHttpRequest 的方式有很多怪癖,这段 JS 代码将适用于所有浏览器:https :
//github.com/ilinsky/xmlhttprequest

此 JS 代码将 XML 转换为易于使用的 JavaScript 对象:http :
//www.terracoder.com/index.php/xml-objectifier

上面的 JS 代码可以包含在页面中,以满足您的无外部库需求。

var symbol = "MSFT"; 
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://www.webservicex.net/stockquote.asmx?op=GetQuote",true);
xmlhttp.onreadystatechange=function() {
 if (xmlhttp.readyState == 4) {
  alert(xmlhttp.responseText);
  // http://www.terracoder.com convert XML to JSON 
  var json = XMLObjectifier.xmlToJSON(xmlhttp.responseXML);
  var result = json.Body[0].GetQuoteResponse[0].GetQuoteResult[0].Text;
  // Result text is escaped XML string, convert string to XML object then convert to JSON object
  json = XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(result));
  alert(symbol + ' Stock Quote: $' + json.Stock[0].Last[0].Text); 
 }
}
xmlhttp.setRequestHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
xmlhttp.setRequestHeader("Content-Type", "text/xml");
var xml = '<?xml version="1.0" encoding="utf-8"?>' +
 '<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/">' + 
   '<soap:Body> ' +
     '<GetQuote xmlns="http://www.webserviceX.NET/"> ' +
       '<symbol>' + symbol + '</symbol> ' +
     '</GetQuote> ' +
   '</soap:Body> ' +
 '</soap:Envelope>';
xmlhttp.send(xml);
// ...Include Google and Terracoder JS code here...

另外两个选项:

我正在使用上面的代码,但是 xmlhttp.responseText 总是结果为 null。你能给我提供一些链接来克服这个错误吗
2021-03-12 13:48:40
删除 Google 代码时的链接:github.com/ilinsky/xmlhttprequest
2021-03-17 13:48:40
如果我想传递多个信封怎么办?
2021-03-29 13:48:40

除非 Web 服务与您的页面位于同一域中,否则无法使用直接的 JavaScript 完成此操作。编辑:在 2008 年和 IE<10 中,除非该服务与您的页面位于同一域中,否则无法使用直接的 javascript 来完成。

如果 Web 服务位于另一个域 [并且您必须支持 IE<10],那么您将必须在您自己的域上使用代理页面来检索结果并将它们返回给您。如果您不需要旧的 IE 支持,那么您需要为您的服务添加 CORS 支持。在任何一种情况下,您都应该使用类似 timyates 建议的 lib 之类的东西,因为您不想自己解析结果。

如果 Web 服务在您自己的域中,则不要使用 SOAP。没有充分的理由这样做。如果 Web 服务在您自己的域中,则对其进行修改,以便它可以返回 JSON 并省去处理 SOAP 带来的所有麻烦的麻烦。

简短的回答是:不要从 javascript 发出 SOAP 请求。使用 Web 服务从另一个域请求数据,如果这样做,则在服务器端解析结果并以 js 友好的形式返回它们。

目的是让 SOAP 服务器也提供一个 HTML 页面以进行简单的测试和评估。客户端将位于同一域中。前端不使用 SOAP 似乎是公认的观点。任何关于为什么的评论?请添加新问题:stackoverflow.com/questions/127038
2021-03-10 13:48:40
@Constantin,如果您愿意仅支持较新的浏览器并且您可以控制服务器并且可以在那里添加 CORS 支持,则 CORS 将允许它。话虽如此,我仍然认为 SOAP 调用应该只在服务器之间进行,而客户端应该使用更 JS 友好的东西,比如 JSON。
2021-03-11 13:48:40
在那里回答没有意义......我同意 Gizmo 的所有三点。XML 是臃肿的,用 js 处理是一个挑战,而 JSON 是简洁和原生的。
2021-03-14 13:48:40
-1 因为这不能回答问题。在您的域上拥有一个无法“修改以返回 JSON”的第 3 方应用程序的用例怎么样?
2021-03-27 13:48:40
重新“无法完成”:如果客户端支持Cross-Origin Resource Sharing,今天它可以用(大部分)直接的 JavaScript 来完成希望在 3-4 年内它会普遍可用。
2021-04-03 13:48:40

您可以使用jquery.soap 插件为您完成这项工作。

此脚本使用 $.ajax 发送 SOAPEnvelope。它可以将 XML DOM、XML 字符串或 JSON 作为输入,并且响应也可以作为 XML DOM、XML 字符串或 JSON 返回。

来自网站的示例用法:

$.soap({
    url: 'http://my.server.com/soapservices/',
    method: 'helloWorld',

    data: {
        name: 'Remy Blom',
        msg: 'Hi!'
    },

    success: function (soapResponse) {
        // do stuff with soapResponse
        // if you want to have the response as JSON use soapResponse.toJSON();
        // or soapResponse.toString() to get XML string
        // or soapResponse.toXML() to get XML DOM
    },
    error: function (SOAPResponse) {
        // show error
    }
});

有没有人试过这个?https://github.com/doedje/jquery.soap

似乎很容易实现。

例子:

$.soap({
url: 'http://my.server.com/soapservices/',
method: 'helloWorld',

data: {
    name: 'Remy Blom',
    msg: 'Hi!'
},

success: function (soapResponse) {
    // do stuff with soapResponse
    // if you want to have the response as JSON use soapResponse.toJSON();
    // or soapResponse.toString() to get XML string
    // or soapResponse.toXML() to get XML DOM
},
error: function (SOAPResponse) {
    // show error
}
});

会导致

<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <helloWorld>
        <name>Remy Blom</name>
        <msg>Hi!</msg>
    </helloWorld>
  </soap:Body>
</soap:Envelope>