2015-10-14 30 views
4

我想从我的本地开发箱发送一个Ajax请求使用服务器jQuery的阿贾克斯()GET请求发送选项

<!DOCTYPE html> 
<html> 
<head> 
    <title>JSSample</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
</head> 
<body> 

<script type="text/javascript"> 
    $(function() { 
     var params = { 
      format: "JSON", 
      season: "2015REG" 
      // Request parameters 
     }; 

     $.ajax({ 
      url: "https://<mysite>/sub/" + params.format + "/" + params.season, 
      beforeSend: function(xhrObj){ 
       // Request headers 
       xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key","<mykey>"); 
      }, 
      type: "GET" 
     }) 
     .done(function(data) { 
      alert("success"); 
      console.log("Data: \n" + JSON.stringify(data)); 
     }) 
     .fail(function(error) { 
      alert("error"); 
      console.log("Error" + JSON.stringify(error)); 
     }); 
    }); 
</script> 
</body> 
</html> 
当我看着到Firefox我看到它实际上是发送一个OPTIONS

请求 - 服务器没有响应(未找到404),所以我得到一个跨域请求被阻止的错误。

OPTIONS 
XHR 
https://mysite [HTTP/1.1 404 Resource Not Found 2437ms] 
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://mysite (Reason: CORS header 'Access-Control-Allow-Origin' missing). 

我在做什么错?为什么当我明确发送一个GET时,jquery试图要求选项?另外,我不拥有这个服务器,它的另一家公司,它有一个订阅API,所以我不能泄露密钥或任何信息来帮助排除故障。

回答

1

如果其他服务器是你的,你可以启用cors

,否则你不能(在大多数情况下,*)通过ajax

JavaScript和Web编程发出请求到外域已经成长跨越了多年的 ,但同源政策依然存在。这可以防止JavaScript跨越域边界发出请求,并且 会产生各种黑客来进行跨域请求。

CORS引入了一种标准机制,可供所有浏览器使用,用于实现跨域请求。该规范定义了一套 标题,它允许浏览器和服务器通信哪些请求是(而不是允许的)哪些 请求。 CORS通过为所有人提供API访问,继续保持开放式网络的精神。


一个绕过CORS使用whateverorigin.org方式,这里有一个例子。

$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent('http://google.com') + '&callback=?', function(data){ 
    alert(data.contents); 
}); 
+0

对不起,我只是更新问题说我没有拥有服务器。但是,我能够使用Chrome RestClient应用程序来测试请求,并且使用该客户端成功。这是否意味着我在代码中做错了什么? – Derek

+0

[JSONP](http://dev.socrata.com/docs/cors-and-jsonp。html)可能是另一种选择 - 但是,如果OP遇到了这个问题,那么看起来OP在做一些本质上是错误的事情。 –

+0

@Derek你可能想要用完整的代码来更新你的问题。 –

1

预检(这就是正在发生的事情)对CORS完成时

  • 请求方法不是GET,HEAD或POST;
  • 定制请求报头用于

在你的情况下,自定义首部触发预检

有效地,您的请求CORS正在由服务器拒绝。根据你发布的内容,你需要在请求中使用自定义头部,因此如果远程服务器要提供CORS资源,则需要处理预检请求。

您尝试使用的服务器可能尚未设置以允许客户端(浏览器)连接,只有“服务器”连接没有交叉源限制

+0

因此,当我使用Chrome应用程序RestClient来测试连接时,为什么它能正常工作,但是当我只是制作这个简单的页面并将其加载到本地主机上时,并不适用? – Derek

+0

,因为chrome应用程序不是网页,所以不需要服务器的CORS响应头。从理论上讲,如果需要,您可以编写一个chrom插件作为您的请求的代理。或者,使用您的服务器代理客户端的请求 –

+0

@Jaromanda X,只是想感谢您提及自定义标题......已经追逐了几天,并且该评论做了诀窍。 – GDP