我无法使用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)中看到的内容,但无济于事。
答案 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标头,以确定它是否允许发出请求。如果你有时间深入研究它,那就很有趣了。