将Authorization标头附加到Ajax请求的正确方法是什么?

时间:2015-07-07 12:42:14

标签: jquery ajax web-services knockout.js authorization

我有一个ajax GET请求我在Knockout代码的一部分中触发,我需要确保设置了Authorization标头。

我的偏好通常是使用像这样的jQuery简写方法:

$.getJSON("/api/business", function (allData) {
    var mappedOrgs = $.map(allData, function (item) { return new Business(item) });
    self.businesses(mappedOrgs);
});

没有任何身份验证要求,这本身就没问题,但如果我需要包含持票人令牌,我一直在尝试更加冗长的方式:

var token = sessionStorage.getItem(tokenKey);
var headers = {};
if (token) {
    headers.Authorization = 'Bearer ' + token;
}

$.ajax({
    type: 'GET',
    url: '/api/business',
    headers: headers
}).done(function (data) {
    var mappedOrgs = $.map(data, function (item) { return new Business(item) });
    self.businesses(mappedOrgs);
}).fail(function () { console.error('api call failed'); });

即使尝试通过$ .ajaxSend()方法强制解决问题也不会产生任何结果。

$(document).ajaxSend(function (event, xhr, settings) {
    var token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (token) {
        console.info("Found token. Attaching to headers.");
        headers.Authorization = 'Bearer ' + token;
        settings.headers = headers;
        //console.info(headers);
    }
});

那我在俯瞰什么?我正在检查Fiddler中的每个请求,并且永远不会附加Auth标头。显然有一种正确的方法可以做到这一点,但我在某个地方错过了一步。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

我使用以下内容:

function getListData(url) {
    var d = new $.Deferred();
    cfg.apiLoad();

    $.ajax({
        url: baseUrl + url,
        type: 'GET',
        headers: { "x-access-token": secure.getToken(), "x-access-finger": finger.getFinger() },
        dataType: 'json'
    }).fail(function(a, b, c) {
        cfg.failError(c);
        d.reject(c);
    }).done(function (r) {
        cfg.apiDone(r);
        d.resolve(r.ListResults);
    });

    return d.promise();
}

你可以在那里添加你想要的额外标题,忽略cfg。东西,但这是在一个网络文件中,如在写一次,使用每一个与
   getListData('/api/Name/Endpoint').then(function(r){ '// do something});

然后,这解决了必须重复等任何问题,并像魅力一样工作。 我的API为任何类型的结果返回相同的模型