使用 Javascript 的最简单的 SOAP 示例是什么?
为了尽可能有用,答案应该:
- 具有功能性(换句话说,实际工作)
- 至少发送一个可以在代码其他地方设置的参数
- 处理至少一个可以在代码其他地方读取的结果值
- 使用大多数现代浏览器版本
- 尽可能清晰和简短,不使用外部库
使用 Javascript 的最简单的 SOAP 示例是什么?
为了尽可能有用,答案应该:
这是我可以创建的最简单的 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 -->
浏览器处理 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...
另外两个选项:
JavaScript SOAP 客户端:http :
//www.guru4.net/articoli/javascript-soap-client/en/
从 WSDL 生成 JavaScript:https :
//cwiki.apache.org/confluence/display/CXF20DOC/WSDL+to+Javascript
除非 Web 服务与您的页面位于同一域中,否则无法使用直接的 JavaScript 完成此操作。编辑:在 2008 年和 IE<10 中,除非该服务与您的页面位于同一域中,否则无法使用直接的 javascript 来完成。
如果 Web 服务位于另一个域 [并且您必须支持 IE<10],那么您将必须在您自己的域上使用代理页面来检索结果并将它们返回给您。如果您不需要旧的 IE 支持,那么您需要为您的服务添加 CORS 支持。在任何一种情况下,您都应该使用类似 timyates 建议的 lib 之类的东西,因为您不想自己解析结果。
如果 Web 服务在您自己的域中,则不要使用 SOAP。没有充分的理由这样做。如果 Web 服务在您自己的域中,则对其进行修改,以便它可以返回 JSON 并省去处理 SOAP 带来的所有麻烦的麻烦。
简短的回答是:不要从 javascript 发出 SOAP 请求。使用 Web 服务从另一个域请求数据,如果这样做,则在服务器端解析结果并以 js 友好的形式返回它们。
您可以使用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>