2012-03-22 18 views
6

Sto lavorando a un consumer per un'API self-made e ho serie difficoltà nell'impostare l'intestazione Autorizzazione. Sto usando JQuery per le richieste Ajax, ma il 'beforeSend' non funziona affatto (usando violinista per esaminare le richieste)Le intestazioni di richiesta di autorizzazione Ajax non riescono più e più volte

Questo è il mio codice beforeSend:

$.ajax({ 
    type: "GET", 
    url: url+"/Projects", 
    contentType: "application/json; charset=utf-8", 
    beforeSend: function (req) { 
     req.setRequestHeader("Authorization", AuthBuilder(username, password)); 
    }, 
    success: function (result) { 
     alert("success"); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     alert("fail"); 
    } 
}); 

Beh, se che fallisce cosa fai? Torna al vecchio modo per l'invio di richieste Ajax ... beh questo non funziona o ...

Questo è il mio codice regolare:

function GET(address, callback, error) { 
Request = getXMLHttpObject(); 
Request.open("GET", url + address, true); 

var base64 = Base64.encode(username + ":" + password); 
alert(base64); 
Request.setRequestHeader("Authorization", "Basic " + base64); 

Request.send(); 
Request.onreadystatechange = function() { 
    //alert(Request.readyState+" code "+Request.status); 
    if (Request.readyState == 4 && Request.status == 200) { 
     callback(jQuery.parseJSON(Request.responseText)); 
    } else if (Request.readyState == 4 && Request.status >= 400) { 
     error(Request.status, Request.statusText); 
    } 
} 
} 

non ti dispiace il fatto che io sono non chiedere specificamente json perché il servizio restituisce json per predefinito.

nelle informazioni aggiuntive:

  • l'origine non importa, il servizio consente tutte le origini (è stato testato e confermato)
  • l'autorizzazione funziona quando impostato per le intestazioni (testato in altri client)
  • le intestazioni di autorizzazione solo non vengono inviati
  • AuthBuilder (nome utente, password)) fornisce il corretto formato del contenuto intestazione di base Auth
  • il getXMLHttpObject() è solo qualche copia incolla il codice e funzionava prima

qualche idea?

risposta

1

Bene, ho scoperto qual era il problema. Il servizio self-made lo ha restituito al client come intestazione globale: "Access-Control-Allow-Headers" con solo "Content-Type" al suo interno.

In questo modo i nostri clienti che non utilizzano un agente utente (browser) hanno ignorato queste intestazioni e hanno comunque inviato l'intestazione comunque. Ma il browser ha cercato di ottimizzare la richiesta e ha dichiarato: "Non accetterà l'intestazione Authorization, quindi lo interromperò prima dell'invio". in questo modo il pacchetto è più piccolo e il servizio non lo permetterà comunque (anche se lo ha fatto ...)

Quindi, solo l'aggiunta di "Autorizzazione" alla sezione Intestazioni di controllo di accesso consentite del servizio ha reso il mio Javascript/JQuery/Le richieste Ajax inviano l'intestazione della richiesta normalmente!

Problemi correlati