Javascript 为主干集合设置默认内容类型

Javascript 为主干集合设置默认内容类型,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,如何设置主干集合,以便在所有请求中始终发送“application/json”的内容类型 我尝试过的代码: myCollection = Backbone.Collection.extend({ headers: {"Content-Type": 'application/json'}, url: '/foo' }); 以及: 但是,在fetch()上,没有发送任何内容类型?如果要对所有主干模型和集合进行全局操作,则可以提供自己的功能: ajaxBackbone.ajax=函数(请求)

如何设置主干集合,以便在所有请求中始终发送“application/json”的内容类型

我尝试过的代码:

myCollection = Backbone.Collection.extend({
  headers: {"Content-Type": 'application/json'},
  url: '/foo'
});
以及:


但是,在
fetch()
上,没有发送任何内容类型?

如果要对所有主干模型和集合进行全局操作,则可以提供自己的功能:

ajax
Backbone.ajax=函数(请求){…}

如果您想使用自定义AJAX函数,或者您的端点不支持jQuery.AJAX API,并且您需要调整,那么可以通过设置
Backbone.AJAX
来实现

大概是这样的:

Backbone.ajax = function(request) {
    request = _({ contentType: 'application/json' }).defaults(request);
    return Backbone.$.ajax.call(Backbone.$, request);
};

调用将复制
请求
,而
contentType
始终设置为
'application/json'
,如果您不复制
请求
,您将最终更改不必拥有的数据;更改
请求
可能是无害的,但好习惯就是好习惯。

如果您想在全球范围内对所有主干型号和系列进行更改,那么您可以提供自己的功能:

ajax
Backbone.ajax=函数(请求){…}

如果您想使用自定义AJAX函数,或者您的端点不支持jQuery.AJAX API,并且您需要调整,那么可以通过设置
Backbone.AJAX
来实现

大概是这样的:

Backbone.ajax = function(request) {
    request = _({ contentType: 'application/json' }).defaults(request);
    return Backbone.$.ajax.call(Backbone.$, request);
};

调用将复制
请求
,而
contentType
始终设置为
'application/json'
,如果您不复制
请求
,您将最终更改不必拥有的数据;改变
请求可能无害,但好习惯就是好习惯。

一种方法是覆盖
主干网。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);
}
然后,如果您想定义每个模型的
内容类型
,可以执行以下操作:

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
头。

一种方法是覆盖
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);
}
然后,如果您想定义每个模型的
内容类型
,可以执行以下操作:

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
头。

对于非全局性的集合,是否仍有这样做的方法?您可以重写该方法以始终强制
options.contentType='application/JSON'
。该实现看起来与上面的
主干.ajax
几乎相同,只是
sync
获取三个参数,其中(可选)
选项作为第三个参数。很有趣,ok。我觉得这很奇怪,主干网可以让你设置URL和内容作为一个选项,而不是请求选项。谢谢我猜以前没有人需要它。如果您查看
Backbone.sync
源代码,您将看到除了(AFAIK)GET请求(除非您已启用
emulateHTTP
)之外,Backbone将为所有内容设置
contentType:'application/json'
).@w-van-kuipers您的编辑被拒绝,因为语法为。是否仍要对非全局集合执行此操作?您可以重写此方法以始终强制
options.contentType='application/json'
。该实现看起来与上面的
主干.ajax
几乎相同,只是
sync
获取三个参数,其中(可选)
选项作为第三个参数。很有趣,ok。我觉得这很奇怪,主干网可以让你设置URL和内容作为一个选项,而不是请求选项。谢谢我猜以前没有人需要它。如果您查看
Backbone.sync
源代码,您将看到Backbone将为除GET请求(AFAIK)之外的所有内容设置
contentType:“application/json”
。@w-van-kuipers您的编辑被拒绝,因为语法错误。