2013-09-30 147 views
12

因此,这里是我的电话:jquery.ajax访问控制允许来源

$.ajax({ 
     url: url, 
     headers: { 'Access-Control-Allow-Origin': '*' }, 
     crossDomain: true, 
     success: function() { alert('it works') }, 
     error: function() {alert('it doesnt work')}, 
     datatype: 'jsonp' 
    }); 

我的网址是合法的。你会注意到我没有数据集。我不知道数据类型是否正常工作,因为它的实际XML被返回,但我也试过。它是对sportsdata的api的一个呼叫。在网站上,他们向你展示了x-originating-ip的请求标题,所以我试过了,访问控制允许来源是。

所有这些仍然返回访问控制错误。如果我设置了数据,我不清楚,所以我现在就省略了。我尝试了一些不同的东西,我用Google搜索,我明白为什么我得到错误。我不知道如何解决它。我想不用问,但如果有人能解释或告诉我的方式,这将是极大的赞赏

+4

服务器必须设置访问控制标题,而不是客户端。 –

+0

我是否搞砸了?因为它不是我的本地机器的调用。该服务器不是本地的,但我已阅读其他帖子。为什么,如果我直接在浏览器中输入我的网址,这个调用就可以工作,但是用jquery它不会呢? – dwarf

+0

此外,如果你告诉jQuery期望JSONP,那么服务器必须返回JSONP,而不是XML。 –

回答

8

http://encosia.com/using-cors-to-access-asp-net-services-across-domains/

是指对跨域资源共享更多的细节上面的链接。

你可以尝试使用JSONP。如果API不支持jsonp,则必须创建一个作为API和客户端之间的中间人的服务。就我而言,我创建了一个asmx服务。

示例如下:

Ajax调用:

$(document).ready(function() { 
     $.ajax({ 
      crossDomain: true, 
      type:"GET", 
      contentType: "application/json; charset=utf-8", 
      async:false, 
      url: "<your middle man service url here>/GetQuote?callback=?", 
      data: { symbol: 'ctsh' }, 
      dataType: "jsonp",     
      jsonpCallback: 'fnsuccesscallback' 
     }); 
    }); 

服务(ASMX),这将返回JSONP:

[WebMethod] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public void GetQuote(String symbol,string callback) 
    {   

     WebProxy myProxy = new WebProxy("<proxy url here>", true); 

     myProxy.Credentials = new System.Net.NetworkCredential("username", "password", "domain"); 
     StockQuoteProxy.StockQuote SQ = new StockQuoteProxy.StockQuote(); 
     SQ.Proxy = myProxy; 
     String result = SQ.GetQuote(symbol); 
     StringBuilder sb = new StringBuilder(); 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     sb.Append(callback + "("); 
     sb.Append(js.Serialize(result)); 
     sb.Append(");"); 
     Context.Response.Clear(); 
     Context.Response.ContentType = "application/json"; 
     Context.Response.Write(sb.ToString()); 
     Context.Response.End();   
    } 
+0

'async:false'永远不会做到这一点 – Liam

-1

在我的工作中,我们有不同的端口号我们的RESTful服务数据驻留在一对AS400上的db2中。我们通常使用$.getJSON AJAX方法,因为它使用?callback=?可以轻松返回JSONP,而不会对CORS产生任何问题。

data ='USER=<?echo trim($USER)?>' + 
     '&QRYTYPE=' + $("input[name=QRYTYPE]:checked").val(); 

     //Call the REST program/method returns: JSONP 
     $.getJSON("http://www.stackoverflow.com/rest/resttest?callback=?",data) 
     .done(function(json) {   

       // loading... 
       if ($.trim(json.ERROR) != '') { 
        $("#error-msg").text(message).show(); 
       } 
       else{ 
        $(".error").hide(); 
        $("#jsonp").text(json.whatever); 

       } 

     }) 
     .fail(function(jqXHR, textStatus, error) { 
     var err = textStatus + ", " + error; 
     alert('Unable to Connect to Server.\n Try again Later.\n Request Failed: ' + err); 
     });