我有一个使用此生成器https://github.com/yeoman/generator-backbone运行的Backbone.js应用程序。我需要对在不同服务器和域上运行的服务发出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(我允许来自任何客户端的来源用于测试目的)。以下是我设置CORS的方法:
// 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会以某种方式自动映射到http://localhost:9000/api/v1/data
而不是https://custom.com/api/v1/data
。
更新:如果我这样做"手动"使用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吗?
答案 0 :(得分:1)
将url
作为选项传递给Backbone.Model.prototype.save
将绕过网址生成逻辑(即urlRoot
)并假设网址选项是完整路径(包括域,如果不是POST到当前域名。)
您应该将urlRoot
设置为实体的路径(或您的后端平台可能称之为的任何路径),因此在您的情况下应该是:
var MyModel = Backbone.Model.extend({
urlRoot: 'https://custom.com/api/v1/data'
});
var myModel = new MyModel();
myModel.save(); // POST https://custom.com/api/v1/data
// Assuming that returns an id of '123';
myModel.save(); // PUT https://custom.com/api/v1/data/123
myModel.destroy(); // DELETE https://custom.com/api/v1/data/123
如果您的服务器未设置为处理Backbone样式的RESTful端点,那么您可能只想覆盖Backbone.Model.prototype.url
而不是urlRoot
。
答案 1 :(得分:1)
如果您只想测试对服务器的呼叫,可以下载Chrome扩展程序。它允许您拨打其他域名。这里:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
答案 2 :(得分:0)
向其他域发布请求将无法在浏览器中使用。更好的方法是在服务器中设置一些重定向规则。