如何从 Javascript/jQuery 调用 SOAP WS

2023-12-25

我想直接从 Javascript 调用 SOAP WebService。我一直在环顾四周,但仍然无法发挥作用。我假设我必须构建 SOAP 信封(见下文)。我也使用 jQuery。

首先,我确定我可以调用位于其他地方的 SOAP Web 服务吗?也就是说,没有跨域限制之类的限制。

另外我不确定我需要使用的正确 URL 是什么,SOAP 服务是使用公开的Ladon http://ladonize.org/index.php/Main_About,出于调试目的,我检查了 WS 是否与soapUI 配合良好,以下是我可以找到的 URL:

  • WSDL 网址:http://192.168.1.5/ws/MyWS/soap/description// 根据我的理解,它不可能是这个
  • 服务端点:http://192.168.1.5/ws/MyWS/soap
  • SOAP 操作: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;">&nbsp;</div>

</body>
</html>

此致

EDIT:在继续尝试寻找答案的同时,我读到了=>最简单的 SOAP 示例 https://stackoverflow.com/questions/124269/simplest-soap-example-using-javascriptPrestaul 说“这不能用直接的 JavaScript 来完成,除非 Web 服务与您的页面位于同一域中。”所以,也许我正在尝试做一些不可能的事情?这是它无法工作的原因吗?


您无法发送跨域 AJAX 请求,因为同源政策 http://en.wikipedia.org/wiki/Same_origin_policy浏览器内置的限制。为了使其工作,包含 jQuery 代码的 HTML 页面必须托管在与 Web 服务相同的域中(http://192.168.1.5/ws/MyWS/).

有一些解决方法涉及使用JSONP http://en.wikipedia.org/wiki/JSONP在服务器上,但由于您的 Web 服务是 SOAP,所以这是行不通的。

如果您无法将 javascript 移动到与 Web 服务相同的域,那么唯一可靠的方法是构建一个服务器端脚本,该脚本将托管在与 javascript 代码相同的域上,并充当 Web 服务之间的桥梁。 2 个域。因此,您将向服务器端脚本发送 AJAX 请求,该脚本反过来将调用远程 Web 服务并返回结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Javascript/jQuery 调用 SOAP WS 的相关文章