XMLHttpRequest无法加载“url”。 Access-Control-Allow-Origin不允许使用null

时间:2012-05-17 13:15:42

标签: javascript html xmlhttprequest

我正试图通过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>

`

2 个答案:

答案 0 :(得分:3)

首先,您的请求必须:

  1. 遵守same-origin policy(即请求域名==接收域名)或

  2. 允许通过Access-Control-Allow-Origin标题访问服务页面的异常情况,该标题将您的域列为允许以跨域方式访问该服务器的域。

  3. 此外,您正在使用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?