我正在开发一个骨干应用程序,它涉及从外部API获取数据。 我的应用程序的域名是product.site1.com,而API的域名是api.site1.com。
这就是我的模型和集合的外观
var pModel = new Backbone.Model.extend({});
var pCollection = new Backbone.Collection.extend({
model: pModel,
url: 'api.site1.com/product'
});
和视图如下所示
var pView = new Backbone.View.extend({
initialize: function() {
var _this = this;
var pCollectionVar = new pCollection();
pCollectionVar.fetch({
dataType: 'jsonp',
beforeSend: _this.sendAuthentication,
success: function(collection, response, options) {
console.log(collection);
},
error: function(collection, xhr, options) {
console.log("error");
}
});
}
sendAuthentication: function(xhr) {
xhr.setRequestHeader('customKey1', 'ABCD');
xhr.setRequestHeader('customKey2', '1234');
}
});
当我执行此操作时,我的应用程序向API服务器发出get请求,而我没有在服务器端获取头数据。我没有在chrome dev工具中看到为请求设置的这些自定义标头。
修改 选项http://api.site1.com/product 405(方法不允许)jquery-1.10.2.js:8706
选项http://api.site1.com/product无效的HTTP状态码405 jquery-1.10.2.js:8706
XMLHttpRequest无法加载http://api.site1.com/product。无效的HTTP状态代码405(索引):1
这些是我在执行请求时遇到的错误。
答案 0 :(得分:0)
如果你想像使用sendAuthentication一样使用它应该是一个全局函数:
pCollectionVar.fetch({
dataType: 'jsonp',
beforeSend: sendAuthentication,
success: function(collection, response, options) {
console.log(collection);
},
error: function(collection, xhr, options) {
console.log("error");
}
});
function sendAuthentication(xhr){
//Code goes here
}
虽然这会污染全局范围,但我会使用命名空间:
var MyApplication = {};
MyApplication.sendAuthentication = function(xhr){ //code inside}.
pCollectionVar.fetch({
dataType: 'jsonp',
beforeSend: MyApplciation.sendAuthentication,
success: function(collection, resp){//rest...}
编辑:
如here所述,jsonp不是ajax调用,不能这样对待