用SOAP信封调用Web服务使用Javascript失败
问题描述:
我尝试从浏览器访问我开发的简单邮件列表服务。我修改了一个我发现的工作示例,但我不知道为什么请求似乎无法到达该服务,因此没有响应返回。用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...
等等。
答
SOAP必须通过POST发送,而不是GET。
此外,它看起来像您的WS-Messaging标头是错误的。事实上,我甚至都没有看到它们。
尝试使用.NET客户端发出此调用(“添加服务引用”),然后用Fiddler或类似的东西观察线路,以查看发生了什么。然后做同样的事情。
+0
非常感谢您,我只是将'GET'换成'POST',现在工作得很好。 – talnicolas
Pure Javascript w/no frameworks? AJAX是一种痛苦... – hugomg
是纯粹的Javascript。我发现了一个效果很好的例子,唯一的区别是它发出'POST'请求。 – talnicolas