javascript - 如何从 Javascript/jQuery 调用 SOAP WS

标签 javascript jquery soap

我想直接从 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;">&nbsp;</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/

相关文章:

javascript - 使用按钮而不是滑动的 ionic 滑动盒

javascript - 粘性导航栏不工作

javascript - 如何向此 jQuery 语句添加更多内容

java - 在 java webservice 客户端中重写 XMLGregorianCalendar 类的 XML 绑定(bind)

c++ - gSOAP soapcpp2 #import : Cannot open file “soap12.h” for reading

javascript - 无法访问我的 angularjs Controller 中的 $routeParams

javascript - 为什么我不能在 Chrome(和 Safari)中将 console.log 作为回调参数传递?

javascript - JS 下拉导航菜单无法按预期工作

jquery - 有人可以解释如何实现 jQuery 文件上传插件吗?

android - 如何使用 SOAP 将数据发布到服务器