无法“获取”CORS的mLab数据b / c

时间:2017-07-05 23:35:22

标签: javascript jquery mlab

我无法使用getTasks()函数执行'GET'请求。

$(document).ready(function(){
    getTasks();
});

const apiKey = 'xxxxxxx';

function getTasks(){
    $.ajax({
        type: 'GET',
        url: 'https://api.mlab.com/api/1/databases/taskmanager/collections/tasks?apiKey='+apiKey,
        contentType: 'application/json',
        xhrFields: {
            withCredentials: true
        },
        success: function(data){
            console.log(data);
        },
        error: function(){
            console.log('FAIL')
        }
    })
}

我得到的错误是:

  

api.mlab.com/api/1/databases/taskmanager/collections/tasks?apiKey=xxxxxxx   无法加载资源:服务器响应状态为400   (错误请求)

     

对预检请求的响应未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许原点'null'访问。响应   有HTTP状态代码400。

我了解Windows上的Google-Chrome启用了CORS,并且(默认情况下)不允许与其他域通信。我不确定预检请求是什么。无论如何,我试图实现我从使用CORS - HTML5 Rocks​(来自jQuery部分的CORS)中看到的内容,但无济于事。

2 个答案:

答案 0 :(得分:2)

据猜测,远程API根本无法响应GET次呼叫的转机前请求(因为它不应该)。

您的代码正在触发转机前请求,因为它是non-simple。这是因为您添加了Content-type: application/json标头。请求Content-type标头用于指示请求有效载荷格式。因为它是GET,所以没有有效载荷。

试试这个......

$.getJSON('https://api.mlab.com/api/1/databases/taskmanager/collections/tasks', {
  apiKey: apiKey
}).done(function(data) {
  console.log(data)
}).fail(function() {
  console.log('FAIL')
})

答案 1 :(得分:0)

CORS可以保护您。如果您想了解更多信息,wikipedia上有一个很好的条目。

此处的问题似乎是您尝试直接从您的网络应用访问mlab托管的mongodb。正如您在代码中看到的那样,您提供了凭据/ api密钥来发出请求。

我的猜测是,mlab不允许使用CORS的意图是阻止你这样做。您应该永远将您的私有API密钥放在html中以托管在网页上,因为通过阅读源代码可以轻松访问它。然后有人可以直接访问你的mongodb。

相反,您应该创建一个服务器端应用程序(节点,或者...... **,无论**),在同一个域(或您通过CORS授予的域)上公开您控制的API。

至于"预检"请求,如果你查看你的chrome调试工具,你应该看到一个额外的请求与" OPTIONS"方法。这是chrome(以及大多数其他http客户端)首先发送到托管在不同域上的服务器的请求。它正在寻找Access-Control-Allow-Origin标头,以确定它是否允许发出请求。如果你有时间深入研究它,那就很有趣了。