2011-08-17 9 views
28

Ho ereditato del codice che alla fine farà parte di una chiamata API. Sulla base del codice esistente, la chiamata è un post per recuperare il codice JSON con un access_token. Mentre questo sarebbe normalmente semplice e come ogni altra API là fuori, questo codice richiede che ci sia un campo httpheader personalizzato per il segreto del client.Post JSON con campo HTTPHeader personalizzato

Sono riuscito a farlo funzionare in Objective C con URLRequest, ecc. Ma ora che sto creando la chiamata per un componente Web, sono stato bloccato.

Sto usando un post jquery piuttosto standard

 $.post('https://url.com', 
     {access_token:'XXXXXXXXXXXXXXXXXXX', 
     function(data){ 
      console.info(data); 
     }, 'json'); 

Con un http-equiv nell'intestazione. Ma il post non recupera mai i dati e il server stesso non riconosce che è stata effettuata alcuna chiamata (anche incompleta).

Potrei dover rottamare questo codice e ricominciare da capo, ma se qualcuno ha riscontrato questo problema in precedenza, si prega di offrire qualsiasi intuizione.

risposta

95

Quello che hai postato ha un errore di sintassi, ma non fa alcuna differenza dato che non puoi passare le intestazioni HTTP tramite $.post().

A condizione che tu sia in versione jQuery> = 1,5, passare a $.ajax() e passare l'opzione headers (docs). (Se siete su una versione precedente di jQuery, vi mostrerò come farlo tramite l'opzione beforeSend.)

$.ajax({ 
    url: 'https://url.com', 
    type: 'post', 
    data: { 
     access_token: 'XXXXXXXXXXXXXXXXXXX' 
    }, 
    headers: { 
     Header_Name_One: 'Header Value One', //If your header name has spaces or any other char not appropriate 
     "Header Name Two": 'Header Value Two' //for object property name, use quoted notation shown in second 
    }, 
    dataType: 'json', 
    success: function (data) { 
     console.info(data); 
    } 
}); 
+0

Grazie mille! Mi hai risparmiato ore di frustrazione. Ora, l'oggetto viene estratto in Safari, ma non in Firefox o Chrome. Si tratta di un problema noto e correlato? Se è così, mi piacerebbe la tua intuizione. Altrimenti, lo scoprirò. – Izzy

+0

Quando si utilizza Chrome e Firefox, cosa si vede (tramite strumenti di sviluppo o Firebug) inviato al server e cosa viene visualizzato restituito? Che debugging hai sul server per vedere se la richiesta è in arrivo e corretta? – JAAulde

+0

Nessun errore appare in Firebug, ma non c'è ritorno. Nella Console web di Firefox vedo questo: "OPZIONI https: // [url.com] [HTTP/1.1 200 OK 441ms]" e in Strumenti per sviluppatori di Chrome vedo questo: XMLHttpRequest non può caricare "https://url.com". L'origine null non è consentita da Access-Control-Allow-Origin. ' Il server mostra che è arrivata una richiesta. Se la richiesta fosse impropria, avrebbe registrato un messaggio di errore. – Izzy

0

ho cercato come lei ha ricordato, ma solo il primo parametro sta attraversando e riposo sono tutti visualizzato nel server come undefined. Sto passando JSONWebToken come parte dell'intestazione.

.ajax({ 
    url: 'api/outletadd', 
    type: 'post', 
    data: { outletname:outletname , addressA:addressA , addressB:addressB, city:city , postcode:postcode , state:state , country:country , menuid:menuid }, 
    headers: { 
     authorization: storedJWT 
    }, 
    dataType: 'json', 
    success: function (data){ 
     alert("Outlet Created"); 
    }, 
    error: function (data){ 
     alert("Outlet Creation Failed, please try again.");   
    } 

    }); 
5

se si vuole usare .post() poi Questo imposterà intestazioni per tutti i futuri richiesta fatta con jQuery

$.ajaxSetup({ 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json' 
    } 
}); 

quindi rendere il vostro .post() chiama come di consueto.