2010-07-12 17 views
57

Ho bisogno di fare una richiesta getJSON(), ma come faccio a passare l'autorizzazione e le intestazioni personalizzate?Come posso passare le intestazioni delle richieste con il metodo getJSON() di jQuery?

Si verificano problemi per cui l'intestazione della richiesta assume il nome, ma NON i valori. L'URL viene mostrato tramite una richiesta manuale in Fiddler per essere inserito come opzioni invece di GET/Url.

Ecco un esempio di ciò che stiamo cercando di fare che funziona bene nel violinista; come posso replicare questo con la funzione AJAX? Codice

GET /Service.svc/logins/gdd53535342/houses/vxcbdfsdg/people/dsgsdggd?format=json HTTP/1.1 
User-Agent: Fiddler 
Authorization: Basic rgbg423535fa23y4436 
X-PartnerKey: df3fgeg-g5g6-b55b-f3d2-dsgg353523 
Host: 154.34.53.54:2757 

JavaScript:

xhr = new XMLHttpRequest(); 

$(document).ready(function() { 
    $.ajax({ 
    url: 'http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json', 
    type: 'GET', 
    datatype: 'json', 
    success: function() { alert("Success"); }, 
    error: function() { alert('Failed!'); }, 
    beforeSend: setHeader  
    }); 
}); 

function setHeader(xhr) { 
    xhr.setRequestHeader('Authorization', 'Basic faskd52352rwfsdfs'); 
    xhr.setRequestHeader('X-PartnerKey', '3252352-sdgds-sdgd-dsgs-sgs332fs3f'); 
} 

Fiddler normali intestazioni di richiesta:

GET /service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1 
User-Agent: Fiddler 
Authorization: Basic faskd52352rwfsdfs 
X-PartnerKey: 3252352-sdgds-sdgd-dsgs-sgs332fs3f 
Host: localhost:437 

Fiddler Attraverso Ajax() intestazioni di richiesta:

OPTIONS service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1 
Host: localhost:437 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Proxy-Connection: keep-alive 
Origin: http://ipv4.fiddler:61975 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: authorization,x-partnerkey 
+1

Se stai facendo questo per un servizio JSONP, non è possibile impostare intestazioni supplementari. – Pointy

+0

non solo un json normale. – Berty

risposta

69

Sono d'accordo con Sunetos che dovrete utilizzare la funzione $ .ajax per passare le intestazioni delle richieste. Per fare ciò, dovrai scrivere una funzione per il gestore di eventi beforeSend, che è una delle opzioni $ .ajax(). Ecco un esempio veloce su come farlo:

<html> 
    <head> 
    <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
     $.ajax({ 
      url: 'service.svc/Request', 
      type: 'GET', 
      dataType: 'json', 
      success: function() { alert('hello!'); }, 
      error: function() { alert('boo!'); }, 
      beforeSend: setHeader 
     }); 
     }); 

     function setHeader(xhr) { 
     xhr.setRequestHeader('securityCode', 'Foo'); 
     xhr.setRequestHeader('passkey', 'Bar'); 
     } 
    </script> 
    </head> 
    <body> 
    <h1>Some Text</h1> 
    </body> 
</html> 

Se si esegue il codice sopra e guardare il traffico in uno strumento come Fiddler, vedrete due richieste le intestazioni passati in:

  • securitycode con un valore di Foo
  • chiave di accesso per un valore di Bar

La funzione SetHeader potrebbe anche essere in linea nelle opzioni di $ .ajax, ma ho voluto chiamarlo fuori.

Spero che questo aiuti!

+0

Controllare le modifiche apportate al post originale (nuova domanda) – Berty

+2

Non sono sicuro di aver compreso il problema. La chiave/i valori dell'intestazione dovrebbero essere passati al servizio non come parte dell'URL, ma come opzioni (come hai detto tu). Si imposta X-PartnerKey e l'autorizzazione nel modo in cui l'esempio imposta "securityCode" e "passkey" (che erano solo intestazioni che ho composto). Host e User-Agent devono essere impostati quando si effettua la chiamata $ .ajax. Spiacente se non sto capendo correttamente il problema.Se hai il codice sorgente, per favore pubblicalo e forse questo ti sarà d'aiuto. Grazie! –

+1

Ho impostato le intestazioni della richiesta nello stesso modo in cui lo avete fatto per gli esempi, ma dopo averlo eseguito e visualizzato attraverso il violinista appaiono i nomi delle intestazioni, ma non i valori. Anche nel fiddler sto cercando di fare un GET che verrà visualizzato come GET/URL ma se imposto il tipo su GET appare come OPZIONI/URL. Spero che abbia più senso. Inserirò il codice sorgente ma è praticamente uguale al tuo. Grazie ancora – Berty

12

Il metodo $ GetJSON() è sho che non ti permette di specificare opzioni avanzate come quella. Per fare ciò, è necessario utilizzare il metodo $ .ajax() completo. Avviso nella documentazione a http://api.jquery.com/jQuery.getJSON/, "Questa è una funzione di Ajax stenografia, che equivale a:"

$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback 
}); 

Quindi basta usare $ .ajax() e di fornire tutti i parametri aggiuntivi necessari.

24

Penso che si potrebbe impostare le intestazioni e ancora usare getJSON() in questo modo:

$.ajaxSetup({ 
    headers : { 
    'Authorization' : 'Basic faskd52352rwfsdfs', 
    'X-PartnerKey' : '3252352-sdgds-sdgd-dsgs-sgs332fs3f' 
    } 
}); 
$.getJSON('http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json', function(json) { alert("Success"); }); 
+2

Dalla documentazione (http://api.jquery.com/jquery.ajaxsetup/): "Il suo uso non è raccomandato." –

+3

@ matt-burns, true. La mia soluzione farebbe sì che ogni richiesta jQuery Ajax avesse questi due valori nelle intestazioni. Penso che in questo caso sia innocuo. Potresti incorrere in problemi potenzialmente se stavi usando ajaxSetup() per impostare l'url o il tipo di richiesta. Che io scoraggierei. Qualcosa di cui essere a conoscenza. –

+1

Nel mio caso devo effettivamente usare la stessa intestazione per tutte le chiamate getJSON, quindi questa è una soluzione eccellente per me :) – marlar

Problemi correlati