2015-07-07 6 views
5

Ho una richiesta GET ajax Sto sparando in una sezione del codice Knockout in cui ho bisogno di garantire che l'intestazione di autorizzazione sia impostata.Qual è il modo corretto di allegare un'intestazione Autorizzazione a una richiesta Ajax?

La mia preferenza è di solito per andare con i metodi di stenografia jQuery in questo modo:

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

Questo va bene da sola, senza alcun obbligo di autenticazione, ma se ho bisogno di includere il token portatore, ho cercato il modo più prolisso:

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

Anche cercando di forzare la questione attraverso il $ .ajaxSend() metodo non produce alcun risultato.

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

Quindi cosa sto trascurando? Sto controllando ogni richiesta in Fiddler e l'intestazione Auth non è mai allegata. C'è ovviamente un modo giusto per farlo, ma mi manca un passaggio da qualche parte. Qualsiasi aiuto apprezzato.

+0

Sei sicuro che 'sessionStorage.getItem' restituisca correttamente il tuo token? – nemesv

+0

Sì. L'ho controllato nel debugger e nel codice. –

risposta

3

Io uso il seguente:

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

è possibile aggiungere il numero di intestazioni supplementari in là che si desidera, ignorare il CFG. roba, ma questo è in un file di rete, come nella scrittura una volta, utilizzare staccato; con
getListData('/api/Name/Endpoint').then(function(r){ '// do something});

questo allora risolve eventuali problemi con il dover ripetere ecc e funziona come un fascino. la mia API restituisce lo stesso modello per qualsiasi tipo di risultato

+0

Sì. Che funzioni. Sembra che le intestazioni debbano essere allegate direttamente nella chiamata Ajax e non all'interno di un gestore di eventi che si attiva su eventi di avvio ajax. –

Problemi correlati