如何在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.
所以,你有什么解决办法兄弟? – 2012-08-05 12:23:40
你是什么意思?我刚刚说过,由于同源安全策略,这是不可能的。服务器必须允许使用我无法控制的标题。 – Esailija 2012-08-05 12:24:58
好吧,谢谢:) – 2012-08-05 12:30:47