【发布时间】:2012-11-08 00:45:05
【问题描述】:
我有一个托管在一个域上的 API,该域启用了 CORS,并带有以下标头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Max-Age: 1728000
我可以从 hackst.com 发出 GET 或 POST 请求,并且工作正常。链接:http://hackst.com/#w3SbV
从我托管在另一个域上的主干应用程序中,GET 请求工作正常。但是当我尝试创建和保存新模型(即发出 POST 请求)时,它会失败并出现以下错误:
Failed to load resource: the server responded with a status of 501 (Not Implemented) http://projectwhatup.us:5000/api/posts
XMLHttpRequest cannot load http://projectwhatup.us:5000/api/posts. Origin http://ayush.projectwhatup.us is not allowed by Access-Control-Allow-Origin.
我的相关主干代码:
var newPostData = {
topic : "New Post",
body : "new body",
user_id : 1,
};
var newPostModel = new Post(newPostData);
this.model.create(newPostModel);
我什至尝试过覆盖 create 方法并像这样手动发出 POST 请求:
create : function(data) {
console.log('overriden create');
$.ajax({
"url" : this.url,
"async" : true,
"beforeSend" : function(obj){
console.log(obj);
},
"contentType" : 'application/json',
//"crossDomain" : true, // uncommenting this doesnt help either
"headers" : {
},
"dataType" : 'json',
"type" : 'POST',
"data" : JSON.stringify(data),
"error" : function(err){
console.log('new post creation failed');
console.log(err);
},
"success" : function(resp){
console.log('new post created');
console.log(resp);
}
});
}
同样的错误。
我也在 JSFiddle (http://jsfiddle.net/X9cqh/5/) 上尝试了一个独立的 GET 请求,但是即使我的主干应用程序可以使 GET 请求正常,它也会失败。
在这一点上我完全一无所知。任何提示、指针、解决方案?
【问题讨论】:
-
查看hurl.it HEAD 对您的服务器的请求,似乎只为
http://ayush.projectwhatup.us启用了CORS -
但是,来自 hackst.com 的请求是如何通过的?
-
这是因为您的网络浏览器没有发出请求。与 Hurl.it 类似,当您创建 hackst.com 请求时,它由后端的服务器执行,然后在您的网络浏览器中显示结果。
-
CORS 使一个网页能够直接在浏览器内访问另一个域的信息,例如 ajax 请求。在浏览器之外,任何人都可以随时向任何服务器发出 HTTP 请求。例如,您现在可以从任何计算机远程登录 80 到 projectwhatup.us,无论它们是否启用了 CORS。
-
啊!没想到 hurl 和 hackst 是通过后端发出请求的。
标签: javascript backbone.js xmlhttprequest cors