我有一个Backbone.js应用程序运行这个生成器https://github.com/yeoman/generator-backbone。我需要向一个运行在不同服务器和域上的服务发出一个POST
请求。在我的模型上,我有以下内容:
urlRoot: 'https://custom.com/',
saveData: function(params) {
this.set(params);
if(this.isValid()) {
this.save(null, {
url: 'api/v1/data',
success: function(model, response, options) {
// success
},
error: function(model, response, options) {
// error
}
});
}
}
当我尝试发布数据时,它将数据发布到http://localhost:9000/api/v1/data
。知道为什么 Backbone 网选择POST
到它正在运行的服务器,而不是我提供的设置(https://custom.com/api/v1/data
)吗?
在我的服务器上,我在NodeJS上运行Restify(我允许来自任何客户端的源代码用于测试)。
// Setup CORS
api.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
return next();
});
我怀疑服务器有问题,因为它甚至不能被客户端访问,因为不知何故指定的URL自动Map到http://localhost:9000/api/v1/data
而不是https://custom.com/api/v1/data
。
UPDATE:如果我用jQuery“手动”执行(不使用Backbone的API),它会工作:
saveData: function() {
$.ajax({
type: 'POST',
data: this.toJSON(),
url: 'https://custom.com/api/v1/data'
})
.success(function() {
// success
})
.fail(function() {
// fail
});
}
有没有办法使用Backbone的API来完成它?
3条答案
按热度按时间ru9i0ody1#
将
url
作为选项传递给Backbone.Model.prototype.save
将绕过url生成逻辑(即urlRoot
),并假定url选项是完整路径(如果未POST到当前域,则包括域)。您应该改为将
urlRoot
设置为实体的路径(或者后端平台可能调用它的任何名称),因此在您的情况下,它应该是:如果您的服务器没有设置为处理Backbone风格的RESTful端点,那么您可能只需要覆盖
Backbone.Model.prototype.url
而不是urlRoot
。tf7tbtn22#
如果你只想测试对服务器的调用,你可以下载一个chrome扩展。它将允许你调用不同的域。在这里:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
ds97pgxw3#
从浏览器向不同的域发布请求将不起作用。处理此问题的更好方法是您可以在服务器中设置一些重定向规则。