jquery .ajax()GET请求发送选项

时间:2015-10-14 02:24:44

标签: javascript jquery ajax

我正在尝试使用

从我的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,因此我无法提供密钥或任何有助于排除故障的内容。

2 个答案:

答案 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的预检(即正在发生的事情)已完成
  • 请求方法不是GET,HEAD或POST;
  • 使用自定义请求标头

在您的情况下,您的自定义标题会触发预检

实际上,您的CORS请求被服务器拒绝。根据您发布的内容,您需要在请求中使用自定义标头,因此远程服务器需要处理预检请求(如果要提供CORS资源)

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