我正在学习Web开发,并且正在尝试通过他们的REST API发出ajax请求来查询MongoLab中托管的MongoDB数据库。我的代码非常简单,但我不明白为什么ajax请求总是会出错。帮助
<doctype html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.1.0.min.js"></script>
<title>Data Viewer</title>
</head>
<body>
<form id="the_form" method="post">
<input type="submit" value="Go" />
</form>
<script>
$(function() {
$('#the_form').submit(function() {
$.ajax({
url: 'https://api.mongolab.com/api/1/databases/omnitor-android/collections/logs?apiKey=[some API key in here]',
type: 'GET',
success: function(data) {
alert(data);
},
error: function() {
alert("boom");
}
});
});
});
</script>
</body>
</html>
答案 0 :(得分:3)
这是因为您正在尝试调用托管在不同域中的服务。由于Same origin policy,Ajax不允许跨域请求。你不能使用ajax来调用外部网站。如果你真的想使用,你必须使用JSONP。或者您可以使用服务器端代理。意味着,在服务器端调用外部站点并对该Web服务进行ajax调用。
有关如何执行跨域ajax请求的详细信息,请参阅this link。
答案 1 :(得分:2)
MongoLab REST API完全支持CORS,因此大多数浏览器应该能够毫无问题地向它发出请求。尝试将其添加到js代码的顶部:
$.support.cors = true;
您是否尝试过使用大多数浏览器内置的调试控制台(例如FireBug)?您可以在那里找到更详细的错误消息。
另外,请随时联系support@mongolab.com寻求帮助。
答案 2 :(得分:0)
由于对ajax请求施加了Same Origin Policy约束,它无法正常工作。同源策略可防止浏览器发出跨域请求。
此问题的解决方案是使用jsonp。大多数API提供程序都支持这一点,像jQuery这样的库也支持这个协议。
如果您检查浏览器控制台,则可以找到类似
的内容Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.
您可以使用jQuery.getJson()之类的
$.getJSON('https://api.mongolab.com/api/1/databases/omnitor-android/collections/logs?apiKey=[some API key in here]?callback=?', function(data) {
console.log('xx')
});
答案 3 :(得分:0)
Mongolab确实支持CORS。这意味着你不会在IE *和Opera(http://caniuse.com/cors)中获得太多支持。要将它用于支持CORS的浏览器,您必须确保在jQuery ajax请求中将dataType设置为“json”。
$.ajax(
{
url : url
, type : "GET"
, dataType : "json"
, success : function( data )
{
// do something
}
});
为了获得更多浏览器支持,我建议使用一个简单的代理(例如在PHP中)。 你可以使用类似的东西;
var xhr = new XMLHttpRequest();
if ( ! "withCredentials" in xhr) {
// Use proxy in ajax call
//
}
else {
// Standard CORS call
//
}
答案 4 :(得分:0)
有三种方法可以克服同源政策限制: