我正在尝试使用来自另一个域的 model.fetch(),但我似乎偶然发现了一堵墙。似乎我可以进行跨域请求或设置自定义标头(哪个都没有关系),而不是两者。不幸的是,我需要两者,因为我试图从中获取的 API 使用基本身份验证。
简而言之,这里有一些事情:
var Model = Backbone.Model.extend({
url: function() {
return a_cross_domain_url;
},
initialize: function() {
this.fetch();
}
});
Backbone.sync = _.wrap(Backbone.sync, function(sync, method, model, options) {
if (!options.xhrFields) {
options.xhrFields = {withCredentials:true};
}
options.headers = options.headers || {};
// credentials is a string that looks like 'Basic d2Vwb3c6McriNzk3YZgvZTNkMTkzOGE4MTk3NjMwMDkzNmMwZGI='
options.headers['Authorization'] = credentials;
sync(method, model, options);
});
var m = new Model();
我正在抽象很多代码,但我认为这是相关信息。重要的是最终请求看起来像这样:
据我了解,这就是我所需要的一切。这很有趣,因为 $.ajax.beforeSend 函数确实被触发了,但是根本没有实际 GET 触发的日志(服务器什么也没收到)。它似乎在它被调用之前就被取消了。错误回调确实触发,并打印:
SyntaxError: JSON.parse: unexpected end of data
JSON.parse 可能是因为当错误到达时我期望服务器提供 JSON 以在我的应用程序上将它们显示给最终用户,但是,除了该消息之外,我没有得到任何关于正在发生的事情或原因的线索请求被取消。
最后一点,如果我从请求中删除标头(在上面的 js 上),GET 将被执行,但由于没有身份验证而被服务器拒绝。
任何关于正在发生的事情的想法将不胜感激。