我正在尝试使用
从我的localhost开发框向服务器发送ajax请求<!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,因此我无法提供密钥或任何有助于排除故障的内容。
答案 0 :(得分:1)
如果其他服务器是您的,您可以启用cors
否则您不能(在大多数情况下*)通过ajax
JavaScript和网络编程实现了跨越式发展 多年来,但同源政策仍然存在。这可以防止 JavaScript跨域边界发出请求,并且具有 产生了各种黑客来制作跨域请求。
CORS引入了一种可供所有浏览器使用的标准机制 用于实现跨域请求。规范定义了一组 允许浏览器和服务器进行通信的标头 请求是(并且不是)允许的。 CORS延续了精神 通过为所有人提供API访问来打开网站。
绕过CORS的一种方法是使用whateverorigin.org,这是一个例子。
$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent('http://google.com') + '&callback=?', function(data){
alert(data.contents);
});
答案 1 :(得分:1)
时,CORS的预检(即正在发生的事情)已完成
在您的情况下,您的自定义标题会触发预检
实际上,您的CORS请求被服务器拒绝。根据您发布的内容,您需要在请求中使用自定义标头,因此远程服务器需要处理预检请求(如果要提供CORS资源)
您尝试使用的服务器可能尚未设置为允许客户端(浏览器)连接,只有“服务器”连接没有交叉来源限制