我想直接从 Javascript 调用 SOAP WebService。我一直在环顾四周,但仍然无法正常工作。我假设我必须构建 SOAP 信封(见下文)。我也使用 jQuery。
首先,我确定我可以调用位于其他地方的 SOAP Web 服务吗?即没有跨域限制之类的限制。
我也不确定我需要使用的正确 URL 是什么,SOAP 服务是使用 Ladon 公开的,出于调试目的,我检查了 WS 是否与 soapUI 配合良好,以下是我可以找到的 URL:
- WSDL URL :
http://192.168.1.5/ws/MyWS/soap/description
//根据我的理解,它不可能是这个 - 服务端点:
http://192.168.1.5/ws/MyWS/soap
- SOAPAction:
http://192.168.1.5/ws/MyWS/soap/myOperation
我认为我应该使用端点或 SOAPAction,但它不起作用。我可能会在这里漏掉一些东西,或者后来的 Javascript 有问题,我无法确定。
现在这是我实际调用的 JS(评论中有一些问题):
<html>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<head>
<script type="text/javascript" src="ressources/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
// inspired by http://openlandscape.net/2009/09/25/call-soap-xm-web-services-with-jquery-ajax/
var soapServiceURL = 'http://192.168.1.5/ws/MyWS/soap/myOperation; // not sure what to put here from a LADON point of view
function callSOAPWS(myParameter)
{
var soapMessage =
'<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:LDetector"> \
<soapenv:Header/> \
<soapenv:Body> \
<urn:myOperation soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> \
<myParameter xsi:type="xsd:string">' + myParameter + '</myParameter > \
</urn:myOperation > \
</soapenv:Body> \
</soapenv:Envelope>';
alert("Check SOAP: [" + soapMessage + "]");
jQuery.ajax({
url: soapServiceURL,
type: "POST",
dataType: "xml",
data: soapMessage,
contentType: "text/xml; charset=\"utf-8\"",
//processData: false, // what is it for? may be should be true when using 'complete:' ?
//timeout: 5000,
// below I first try to have only 'complete:' then I tried to have 'success:' + 'error:', then the 3. Nothing seems to be ok. I do not find which one i should use.
complete: myCallback,
success: function( response ){
document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + 'success!' + '\n';
alert("success!!!");
},
error: function(XMLHttpRequest,textStatus, errorThrown){
document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + 'error : ' + textStatus + '\n';
alert("error : " + textStatus);
}
});
alert('if we reach this line, is it a fail?!');
return false;
}
function myCallback(xmlHttpRequest, status)
{
jQuery(xmlHttpRequest.responseXML)
.find('detected')
.each(function()
{
var result = jQuery(this).find('result').text();
document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + result + '\n';
alert('ok : [' + result + ']');
});
}
// https://stackoverflow.com/questions/11916780/changing-getjson-to-jsonp?rq=1
jQuery(document).ready(function() {
callSOAPWS('this is a test');
});
</script>
</head>
<body>
<div id="debug" style="background-color:#EEEEEE; height:250px; width:600px; overflow:auto;"> </div>
</body>
</html>
最好的问候
编辑: 在继续尝试搜索答案时,我已经阅读了 => Simplest SOAP example Prestaul 说“这不能用直接的 JavaScript 完成,除非 Web 服务与您的页面位于同一域中。”所以,也许我正在尝试做一些不可能的事情?这是它不能工作的原因吗?
最佳答案
由于 same origin policy,您无法发送跨域 AJAX 请求浏览器内置的限制。为了使这项工作正常进行,包含 jQuery 代码的 HTML 页面必须托管在与 Web 服务相同的域 (http://192.168.1.5/ws/MyWS/
)。
有涉及使用 JSONP 的解决方法在服务器上,但由于您的 Web 服务是 SOAP,因此无法正常工作。
如果您不能将 javascript 移动到与 Web 服务相同的域中,唯一可靠的方法是构建一个服务器端脚本,该脚本将托管在与 javascript 代码相同的域中,并充当两个域之间的桥梁。因此,您可以向服务器端脚本发送 AJAX 请求,该脚本将调用远程 Web 服务并返回结果。
关于javascript - 如何从 Javascript/jQuery 调用 SOAP WS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796941/