我正试图通过javascript调用Web服务。在Internet Explorer 9中正常工作,而chrome不起作用。错误如下:
“OPTIONS http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl 400(错误请求) XMLHttpRequest无法加载http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl。 Access-Control-Allow-Origin不允许使用null。“
我留下代码来帮助我。谢谢。 ` function SOAPClient(){ this.wsdl =''; this.async = true; this.action =''; this.xml ='';
SOAPClient.prototype.invoke = function(){
var xhr;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xhr = new XMLHttpRequest();
} else {// code for IE6, IE5
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.onreadystatechange=function() {
if (xhr.readyState >= 3){
alert ('ReadyState '+xhr.readyState+' - - Status '+xhr.status);
if(xhr.status == 200)
document.getElementById("txtResult").innerHTML=xhr.responseText;
else
document.getElementById("txtResult").innerHTML='Error';
}
}
xhr.open("POST", this.wsdl,this.async);
xhr.setRequestHeader("SOAPAction", this.action);
xhr.setRequestHeader("Content-Type", "text/xml");
xhr.setRequestHeader("Connection", "close");
xhr.send(this.xml);
return false;
}
}
</script>
<script type="text/javascript">
var wsdl = 'http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl';
var action = 'GetConversionRate';
var xml = '';
var async = true;
var response = '';
function prueba(){
var client = new SOAPClient();
client.wsdl = wsdl;
client.action = action;
client.xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.restfulwebservices.net/ServiceContracts/2008/01"><soapenv:Header/><soapenv:Body><ns:GetConversionRate><ns:FromCurrency>EUR</ns:FromCurrency><ns:ToCurrency>GBP</ns:ToCurrency></ns:GetConversionRate></soapenv:Body></soapenv:Envelope>';
client.invoke();
return false;
}
</script>
</head>
<body>
<p>Versión 2.5</p>
<form name="form" action="#">
Term: <input type="text" name="inputValue" method="post"/>
<button onclick="prueba()">Search</button>
<p id="txtResult"></p>
</form>
</body>
`
答案 0 :(得分:3)
首先,您的请求必须:
遵守same-origin policy(即请求域名==接收域名)或
允许通过Access-Control-Allow-Origin
标题访问服务页面的异常情况,该标题将您的域列为允许以跨域方式访问该服务器的域。
此外,您正在使用file://
文档发出请求,而Chrome 可能禁止其执行任何跨域XHR,即使服务器提供了全权许可{ {1}}。您应该运行本地服务器以通过HTTP访问您的文件,或者只是在其他浏览器中进行测试。
答案 1 :(得分:0)
如果您在不同的域上,则必须如上所述设置Access-Control-Allow-Origin标头。 听起来您还没有处理由您的应用程序完成的OPTIONS请求。这只是当请求类型不是GET或POST时浏览器发出的附加请求。您所要做的就是返回具有正确的Access-Control-Allow-Origin权限的标头,让浏览器知道允许发出跨域请求。 我不确定你在后台使用的是什么,但是看看这篇文章,看看它是如何在Rails中完成的。 How to be aple to POST, PUT and DELETE from Backbone app to Rails app on different subdomains?