2015-07-07 18 views
5

Ajax GET isteğim var Yetkilendirme başlığının ayarlandığından emin olmak için Knockout kodunun bir bölümünde görev yapıyorum.Bir Ajax isteğine bir yetkilendirme üstbilgisinin eklenmesinin doğru yolu nedir?

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

Bu, herhangi bir yetkilendirme gereksinimi olmadan kendi başına gayet iyi ama taşıyıcı kodu şu gerekiyorsa, ben çalışıyorum:

Benim tercih şöyle jQuery steno yöntemleri ile gitmek genellikle daha uzun bir yoludur:

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'); }); 

bile() yöntemi herhangi bir sonuç vermezse $ .ajaxSend aracılığıyla konuyu zorlamak için çalışıyor.

$(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); 
    } 
}); 

Peki ben neye bakıyorum? Fiddler'daki her talebi kontrol ediyorum ve Auth başlığı asla eklenmedi. Açıkçası bunu yapmanın doğru bir yolu var ama bir yerde bir adımı kaçırdım. Herhangi bir yardım takdir edildi.

+0

'sessionStorage.getItem 'ifadesinin doğru şekilde jetonu döndürdüğünden emin misiniz? – nemesv

+0

Evet. Hata ayıklayıcısında ve kodda kontrol ettim. –

cevap

3

i aşağıdaki kullanın:

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(); 
} 

orada istediğiniz bu konuda birçok ekstra üstbilgi ekleyebilirsiniz, cfg görmezden. şeyler, ama bu yazma gibi bir kez, bu daha sonra vb tekrarlamak zorunda herhangi bir sorun çözer ve bir cazibe gibi çalışır
getListData('/api/Name/Endpoint').then(function(r){ '// do something});

ile everywere kullanmak, bir ağ dosyası mevcuttur. API'm her model için aynı modeli geri döndürüyor

+0

Yep. Bu işe yarıyor. Başlıklar Ajax çağrısına doğrudan eklenmeli ve ajax başlangıç ​​olaylarını tetikleyen bir olay işleyicisinde değil. –

İlgili konular