2011-11-02 97 views
1

我尝试从浏览器访问我开发的简单邮件列表服务。我修改了一个我发现的工作示例,但我不知道为什么请求似乎无法到达该服务,因此没有响应返回。用SOAP信封调用Web服务使用Javascript失败

使用SOAP信封是一个需求,我需要知道这段代码可能有什么问题,而不是如何使用其他技术做同样的事情。 (该服务在GlassFish服务器上正确部署,并且我有一个正在工作的Java客户端来测试它,所以服务没有问题)

有人看到坏东西(我也加入了WSDL,如果你需要的话其他细节不要犹豫)?谢谢!

<html> 
<head> 
    <title>Soap Invocation</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

    <script type="text/javascript"> 

     var request = null; 

     function createRequest() { 
      if (window.XMLHttpRequest){ 
       request=new XMLHttpRequest(); 
      } 
      else{ 
       if (new ActiveXObject("Microsoft.XMLHTTP")) { 
        request = new ActiveXObject("Microsoft.XMLHTTP"); 
       } else { 
        request = new ActiveXObject("Msxml2.XMLHTTP"); 
       } 
      } 
     } 

     function getMail() { 
      createRequest(); 
      var envelope = "<?xml version='1.0' encoding='UTF-8'?>"; 
      envelope += "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>"; 
      envelope += "<soap:Header/>"; 
      envelope += "<soap:Body>"; 
      envelope += "<ns2:getMails xmlns:ns2='http://service.inf4375.com/'>"; 
      envelope += "</ns2:getMails>"; 
      envelope += "</soap:Body>"; 
      envelope += "</soap:Envelope>"; 

      var url = "http://127.0.0.1:8080/SoapService/MailingService"; 

      request.onreadystatechange = updatePage; 

      request.open("GET", url, false); 
      request.setRequestHeader("Content-Type", "text/html"); 
      request.setRequestHeader("SOAPAction", ""); 
      request.send(envelope); 
     } 

     function updatePage() { 

      if(request.readyState == 4) { 
       document.getElementById("get").innerHTML = "<p>" + request.responseXML.selectSingleNode("//return").text + "</p>"; 
      } else { 
       document.getElementById("get").innerHTML = "Loading..." 
      } 

     } 
    </script> 
</head> 
<body> 
    <input type="button" value="GetMail" onclick="getMail();" /> 
    <span id="get"></span>  
</body> 
</html> 

的WSDL:

<?xml version='1.0' encoding='UTF-8'?> 
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.inf4375.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.inf4375.com/" name="MailingService"> 
<types> 
    <xsd:schema> 
     <xsd:import namespace="http://service.inf4375.com/" schemaLocation="http://localhost:8080/SoapService/MailingService?xsd=1"/> 
    </xsd:schema> 
</types> 
<message name="getMails"> 
    <part name="parameters" element="tns:getMails"/> 
</message> 
<message name="getMailsResponse"> 
    <part name="parameters" element="tns:getMailsResponse"/> 
</message> 
<message name="addMail"> 
    <part name="parameters" element="tns:addMail"/> 
</message> 
<message name="addMailResponse"> 
    <part name="parameters" element="tns:addMailResponse"/> 
</message> 
<portType name="Mailing"> 
    <operation name="getMails"> 
     <input wsam:Action="http://service.inf4375.com/Mailing/getMailsRequest" message="tns:getMails"/> 
     <output wsam:Action="http://service.inf4375.com/Mailing/getMailsResponse" message="tns:getMailsResponse"/> 
    </operation> 
    <operation name="addMail"> 
     <input wsam:Action="http://service.inf4375.com/Mailing/addMailRequest" message="tns:addMail"/> 
     <output wsam:Action="http://service.inf4375.com/Mailing/addMailResponse" message="tns:addMailResponse"/> 
    </operation> 
</portType> 
<binding name="MailingPortBinding" type="tns:Mailing"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
    <operation name="getMails"> 
     <soap:operation soapAction=""/> 
     <input> 
      <soap:body use="literal"/> 
     </input> 
     <output> 
      <soap:body use="literal"/> 
     </output> 
    </operation> 
    <operation name="addMail"> 
     <soap:operation soapAction=""/> 
     <input> 
      <soap:body use="literal"/> 
     </input> 
     <output> 
      <soap:body use="literal"/> 
     </output> 
    </operation> 
</binding> 
<service name="MailingService"> 
    <port name="MailingPort" binding="tns:MailingPortBinding"> 
     <soap:address location="http://localhost:8080/SoapService/MailingService"/> 
    </port> 
</service> 

我不明白的错误控制台,当我试图执行它在Firefox上的任何错误,并且Internet Explorer只显示Loading...等等。

+0

Pure Javascript w/no frameworks? AJAX是一种痛苦... – hugomg

+0

是纯粹的Javascript。我发现了一个效果很好的例子,唯一的区别是它发出'POST'请求。 – talnicolas

回答

3

SOAP必须通过POST发送,而不是GET。

此外,它看起来像您的WS-Messaging标头是错误的。事实上,我甚至都没有看到它们。

尝试使用.NET客户端发出此调用(“添加服务引用”),然后用Fiddler或类似的东西观察线路,以查看发生了什么。然后做同样的事情。

+0

非常感谢您,我只是将'GET'换成'POST',现在工作得很好。 – talnicolas