$ .ajaxSetup不起作用

use*_*165 5 javascript ajax request-headers

我有以下功能来设置我的AJAX请求的标头:

self.authenticate = function () {
    self.token = sessionStorage.getItem(tokenKey);
    var headers = {};

    if (self.token) {
        headers.Authorization = 'Bearer ' + self.token;
        $.ajaxSetup({
            headers: headers
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,当我检查开发人员收费(F12)或Fiddler中的标头时,我没有看到那里的custon标头,但是当我在请求上设置标头而不是通过ajaxSetup它完美地工作时.

authenticate在布局页面中调用这些函数:

$(document).ready(function () {
     var avm = new AuthenticationViewModel();
     avm.authenticate();
});
Run Code Online (Sandbox Code Playgroud)

self.token不是null.

例如,对于此请求:

self.getUsers = function (callback) {
    $.get("../API/Users/GetUsers/",callback);
}
Run Code Online (Sandbox Code Playgroud)

这些是标题: 在此输入图像描述

我错过了什么?

Mr_*_*ect 5

$ .ajaxSetup为将来的Ajax请求设置默认值.

不建议按照JQuery文档中的建议使用它.

无论如何,因为它设置了将来调用的默认值,它必须在所有依赖于这些默认值的ajax调用之前执行.举例来说,如果你没有提到的url电话,默认url的是配置的$ajaxSetup将是url通话的.如果您所做的调用取决于那些默认值,那么此代码

self.authenticate = function () {
    self.token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (self.token) {
        headers.Authorization = 'Bearer ' + self.token;
        $.ajaxSetup({
            headers: headers
        });
    }
} 
Run Code Online (Sandbox Code Playgroud)

必须在进行以下调用之前执行.

self.getUsers = function () {
    $.get("../API/Users/GetUsers/");
}
Run Code Online (Sandbox Code Playgroud)

现在检查一下

***************寻求回答****************

在那个plunker 中,按F12键进入开发者控制台中的网络选项卡,然后检查由和生成的那些调用中的标题$.ajax()$.get()

我在观察到的那个(要点读)点,

  • 如果呼叫是,$.ajax()那么标题显示,并且url呼叫是在url中提到的$.ajaxSetup
  • 如果呼叫是,$.get()那么标题没有显示,并且url调用的是plunkerurl意味着在你的情况下它将是http://MySite/等等.

$.ajax()是最可配置的,您可以在其中获得对HTTP标头等的细粒度控制.您还可以使用此方法直接访问XHR对象.还提供了稍微更精细的错误处理.因此可能更复杂,而且往往是不必要的,但有时非常有用.您必须使用回调处理返回的数据.

$.get()只是一个简写,$.ajax()但是抽象出一些配置,为它隐藏的东西设置合理的默认值.将数据返回给回调.它只允许GET请求,因此伴随着$.post()类似抽象的功能,仅用于POST

有关更多信息

$ .ajax()和$ .get(),$ .post()之间的差异

如果你愿意,可以测试一下.


$ .ajax()调用的图片

在此输入图像描述


$ .get()调用的图片

在此输入图像描述

因此,如果你想设置headers正确使用$.ajax()而不是$.get()

希望这可以帮助 :)


use*_*165 3

我最终搬家了:

$(document).ready(function () {
     var avm = new AuthenticationViewModel();
     avm.authenticate();
});
Run Code Online (Sandbox Code Playgroud)

Layout页面到页面本身,这解决了问题。

AuthenticationViewModel - 创建一个新的 AuthenticationViewModel 用于登录用户并获取其信息。