2016-06-06 44 views
6

ho provato entrambe le cose separatamente:XMLHttpRequest/ajax set Content-Type

nota: url è una variabile che contiene un URL HTTPS e jsonString contiene una stringa JSON valida

var request = new XMLHttpRequest(); 
try{ 
    request.open("POST", url); 
    request.setRequestHeader('Accept', 'application/json'); 
    request.send(jsonString); 
} catch(e) { 
    alert(e); 
} 

e

var options = { 
    type: "POST", 
    url: url, 
    dataType: "json", 
    data: jsonString, 
    accept: "application/json" 
}; 

$.ajax(options) 

Il problema è che il sistema che stiamo postando richiede un'intestazione Content-Type con un valore "application/json".

Con il modo in cui stanno le cose in questo momento, il metodo utilizzato è POST, l'intestazione Accept è "application/json", e le impostazioni predefinite Content-Type a "/ x-www-form-urlencoded domanda; charset = UTF 8 "

Nel primo esempio, se request.setRequestHeader ('Content-Type', 'application/json'); viene aggiunta 1 riga sopra o sotto l'intestazione Accept, il metodo utilizzato cambia in OPTIONS, l'intestazione Accept cambia in "text/html, application/xhtml + xml, application/xml; q = 0.9, /; q = 0.8" e l'intestazione Content-Type scompare come se non fosse stata vista.

Nel secondo esempio, se contentType: "application/json" viene aggiunto ovunque all'interno delle opzioni, accade la stessa cosa che è accaduta nel primo esempio.

Qual è il modo corretto di impostare un'intestazione Content-Type in ajax o XMLHttpRequest?

Edit: Vorrei aggiungere che utilizzando il plugin client resto firefox, la stringa JSON, url, e accettare e intestazioni content type tutti funzionano bene. Sembra che non riusciamo a ottenere l'intestazione del contenuto impostata sulla nostra pagina.

+0

Hai un esempio di jsfiddle? Non ho mai usato l'oggetto XMLHttpRequest prima, ma l'impostazione contentType su "application/json" dovrebbe funzionare con jquery. Inoltre, non penso ci sia un'impostazione "accetta". Inoltre, una richiesta di verifica preliminare OPZIONI si verifica quando si effettua una chiamata interdominio. È quello che stai facendo? – georaldc

+0

Voglio dire, un preflight OPTIONS si verifica quando si effettua una chiamata interdominio con un valore del tipo di contenuto diverso da quello predefinito "application/x-www-form-urlencoded; charset = UTF-8" con JQuery.ajax() – georaldc

risposta

6

Nel primo esempio, se request.setRequestHeader ('Content-Type', 'application/json'); si aggiunge 1 riga sopra o sotto l'intestazione Accept, il metodo utilizzato modifiche alle opzioni

Questo è perché si stanno facendo a cross origin request da JS incorporato in una pagina web. La modifica di content-type (con una che non è possibile creare con un semplice modulo HTML) innesca a preflight request chiedendo l'autorizzazione al server per effettuare la richiesta effettiva.

È necessario configurare il server per rispondere con le intestazioni CORS appropriate per concedere l'autorizzazione.

HTTP/1.1 200 OK 
Date: Mon, 01 Dec 2008 01:15:39 GMT 
Access-Control-Allow-Origin: http://your.site.example.com 
Access-Control-Allow-Methods: POST, GET, OPTIONS 
Access-Control-Allow-Headers: Content-Type 

Poi il browser farà l'Inserisci richiesta si sta chiedendo per renderlo.

+0

perché il plug-in del client per il resto del firefox non attiva una richiesta di origine incrociata? o se lo fa, perché è in grado di passare senza problemi? – backcab

+2

@backcab - Perché è installato software e non un po 'di JavaScript da un sito Web non affidabile. – Quentin