如何在JavaScript或JQuery中调用SOAP(XML)webservice?

如何在JavaScript或JQuery中调用SOAP(XML)webservice?

问题描述:

我试图调用webservice的asp.net javascript中/ jQuery的, 我已经试过这样的例子很多,但遗憾的是没有成功,如何在JavaScript或JQuery中调用SOAP(XML)webservice?

这里是我目前正试图代码,

login("[email protected]", "123456"); 
    var productServiceUrl = 'http://localhost:50575/Service1.asmx?op=test'; // Preferably write this out from server side 

    function login(Email, Password) { 
     var soapMessage = '<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> \ 
<login xmlns="http://test.com/"> \ 
<Email>' + Email + '</Email> \ 
<Password>' + Password + '</Password> \ 
</login> \ 
</soap:Body> \ 
</soap:Envelope>'; 

     $.ajax({ 
      url: productServiceUrl, 
      type: "GET", 
      dataType: "xml", 
      data: soapMessage, 
      complete: endSaveProduct, 
      error: function (a, b, c) { 
       alert(a + "\n" + b + "\n" + c); 
      }, 
      contentType: "text/xml; charset=\"utf-8\"" 
     }); 

     return false; 
    } 

    function endSaveProduct(xmlHttpRequest, status) { 
     $(xmlHttpRequest.responseXML) 
    .find('loginResult') 
    .each(function() { 
     alert($(this).find('Message').text()); 
    }); 
    } 

请帮我, 在此先感谢。

有多种问题:

  • 要发送到不同的域的请求,所以它不会,除非该领域的工作是发送跨源资源共享(CORS)标题Access-Control-Allow-Origin: *或专门让你的出身
  • 您正在使用GET,因为您应该使用POST,因为在SOAP over HTTP中,信封必须位于请求正文中。
  • jQuery始终认为您的数据是application/x-www-form-urlencoded,除非您将processData设置为false。只有设置contentType只会使标题处于谎言状态,并不会真正改变这一点。事实上,如果参数data是一个字符串,则不是这样。

看来您的目标域不允许CORS,所以不可能直接从客户端进行。您必须使用服务器代理来执行请求。

如果他们允许CORS,你会做它像这样:

var soapMessage = '<?xml version="1.0" encoding="utf-8"?>\ 
        <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">\ 
         <soap12:Body>\ 
         <login xmlns="http://tastygo.com/">\ 
          <BBMID>string</BBMID>\ 
          <Email>string</Email>\ 
          <Password>string</Password>\ 
         </login>\ 
         </soap12:Body>\ 
        </soap12:Envelope>'; 

$.ajax("http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx", { 

    contentType: "application/soap+xml; charset=utf-8", 
    type: "POST", //important 
    dataType: "xml", 
    data: soapMessage 

}); 

但是,这将不能工作,因为服务器不允许选项,浏览器必须使用来确定一个跨域请求是否是允许:

OPTIONS http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx 405 (Method Not Allowed) 

第二个问题是:

XMLHttpRequest cannot load http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx. Origin http://stackoverflow.com is not allowed by Access-Control-Allow-Origin. 
+1

所以,你有什么解决办法兄弟? – 2012-08-05 12:23:40

+0

你是什么意思?我刚刚说过,由于同源安全策略,这是不可能的。服务器必须允许使用我无法控制的标题。 – Esailija 2012-08-05 12:24:58

+0

好吧,谢谢:) – 2012-08-05 12:30:47

只需添加http://m.allaccesstnt.com/AATnTWebservices/Webservices/Userwebservice.asmx/测试 & 添加标题在Web服务器端