有没有办法使用JavaScript来使用Web服务?我正在寻找一种内置的方法,使用JavaScript框架不是一种选择。
答案 0 :(得分:17)
您可以使用XmlHttpRequest对象本地使用JavaScript来使用Web服务。但是,实例化此对象因浏览器而异。例如,Firefox和IE 7+允许您将其实例化为本机JavaScript对象,但IE6要求您将其实例化为ActiveX控件。
因此我建议使用抽象库,如jQuery。如果这不是一个选项,那么将创建抽象为工厂方法并检查浏览器版本。
要使用它来进行Web服务调用,只需实例化该对象,然后调用它的open()方法。我建议这样做是异步的,以保持UI响应。调用异步时,您将获得指定异步方法的回调,该异步方法将指示请求的状态。当状态为4(已加载)时,您可以获取响应数据然后进行处理。
如何处理数据将取决于它是什么,如果它是JSON,那么你可以通过JavaScript的eval()方法运行它,但这确实有一些安全隐患。如果是XML,您可以使用XML DOM来处理它。
有关XMLHttpRequest对象的更多信息,请参阅Wikipedia。
答案 1 :(得分:5)
如果服务托管在您的域中,则可以创建XMLHttpRequest。如果没有,您将遇到跨域问题。
答案 2 :(得分:2)
您可以使用XMLHttpRequest对象,但由于您不想使用任何JavaScript框架,因此您必须自己编组和解组SOAP信封。
答案 3 :(得分:0)
同时检查XML HTTP Request以获取有关使用XmlHttpRequest对象的详细信息页。
答案 4 :(得分:0)
有一个用javascript编写的小库,可以用作XML-SOAP客户端。 我不知道它是否适用于所有浏览器,但它可能会帮助你。你可以找到它here
答案 5 :(得分:0)
这很有用。它是旧的(检查Netscape),是在所有Ajax工具出来之前编写的。你必须处理不同的浏览器 - 基本上,IE是单向的,而其他人则是另一种方式。
// javascript global variables
var soapHeader = '<?xml version=\"1.0\"?>'
+ '<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"'
+ ' SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"'
+ ' xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\"'
+ ' xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"'
+ '>'
+ '<SOAP-ENV:Header/>'
+ '<SOAP-ENV:Body>';
var soapFooter = '</SOAP-ENV:Body>'
+ '</SOAP-ENV:Envelope>';
var destinationURI = '/webservices/websalm';
var actionURI = '';
function callWebService(nsCallback,ieCallback,parms) {
try
{
// Create XmlHttpRequest obj for current browser = Netscape or IE
if (navigator.userAgent.indexOf('Netscape') != -1)
{
SOAPObject = new XMLHttpRequest();
SOAPObject.onload = nsCallback;
} else { //IE
SOAPObject = new ActiveXObject('Microsoft.XMLHTTP');
SOAPObject.onreadystatechange = ieCallback;
}
SOAPObject.open('POST', destinationURI, true);
// Set 2 Request headers, based on browser
if (actionURI == '') {
SOAPObject.setRequestHeader('SOAPAction', '\"\"');
} else { SOAPObject.setRequestHeader('SOAPAction', actionURI);
}
SOAPObject.setRequestHeader('Content-Type', 'text/xml');
// Compose the Request body from input parameter + global variables
var requestBody = soapHeader + parms + soapFooter
// Send, based on browser
if (navigator.userAgent.indexOf('Netscape') != -1)
{
SOAPObject.send(new DOMParser().parseFromString(requestBody,'text/xml'));
} else {
SOAPObject.send(requestBody);
}
} catch (E)
{
alert('callWebService exception: ' + E);
}
}