如何设置Backbone集合以始终在所有请求中发送内容类型的“application / json”?
我试过的代码:
myCollection = Backbone.Collection.extend({
headers: {"Content-Type": 'application/json'},
url: '/foo'
});
和
myCollection = Backbone.Collection.extend({
contentType: 'application/json',
url: '/foo'
});
但是在fetch()
上没有发送内容类型?
答案 0 :(得分:3)
一种方法是覆盖Backbone.sync
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Content-Type': 'application/json');
};
_sync.apply(Backbone, arguments);
}
然后,如果您想定义每个模型的Content-Type
,您可以这样做:
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
var contentType = model.contentType || null;
// var contentType = model.contentType || 'application/json'; // default to json
if(contentType) {
xhr.setRequestHeader('Content-Type': contentType);
}
};
_sync.apply(Backbone, arguments);
}
但是,如果您正在寻找一种方法告诉您的服务器在fetch()
电话上返回JSON,那么您真正需要的是Accept
标题。
答案 1 :(得分:2)
如果您想对所有Backbone模型和集合进行全局操作,那么您可以提供自己的Backbone.ajax
功能:
ajax
Backbone.ajax = function(request) { ... };
如果您想使用自定义AJAX功能,或者您的端点不支持 jQuery.ajax API并且需要调整内容,可以通过设置
Backbone.ajax
来实现
这样的事情:
Backbone.ajax = function(request) {
request = _({ contentType: 'application/json' }).defaults(request);
return Backbone.$.ajax.call(Backbone.$, request);
};
_.defaults
来电将request
的副本contentType
始终设置为'application/json'
,如果您不复制request
,您将结束更改您不一定拥有的数据;改变request
可能是无害的,但良好的习惯是良好的习惯。