2009-07-17 7 views
72

Sto cercando di impostare l'intestazione Accept HTTP a "text/xml" con questo codice jQuery:Impossibile impostare correttamente l'header Accept HTTP con jQuery

$.ajax({ 
    beforeSend: function(req) { 
     req.setRequestHeader("Accept", "text/xml"); 
    }, 
    type: "GET", 
    url: "[proper url]", 
    contentType: "text/plain; charset=utf-8", 
    dataType: ($.browser.msie) ? "text" : "xml", 
    username: '---', 
    password: '-------',         
    success: function(data) { 
     var xml; 
     if (typeof data == "string") { 
      alert("Data is string:" + data); 
      xml = new ActiveXObject("Microsoft.XMLDOM"); 
      xml.async = false; 
      xml.loadXML(data); 
     } else { 
      xml = data; 
      alert("Data is not string:" + $(xml).text()); 
     } 
     // Returned data available in object "xml" 
     //alert("Status is: " + xml.statusText); 
     $("#ingest_history").html($(xml).text()); 
    }    
}); 

In Firefox funziona benissimo.

Ma in IE, il valore che sto cercando di impostare per l'intestazione Accept sembra essere aggiunto alla fine in modo che diventi: Accept: */*, text/xml. Questo fa sì che la mia chiamata ajax restituisca la versione html al contrario della versione xml che voglio.

Qualcuno sa come impostare/cancellare correttamente l'intestazione Accept in IE 8?

Aggiornamento: per qualche motivo gli asterischi non apparivano mentre li inserivo. L'intestazione Accept in IE sembra essere: Accept: */*, text/xml.

risposta

0

Non credo che IE (qualsiasi versione) giochi con l'intestazione Accept. Vedere questo link: [http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Una possibile soluzione potrebbe essere quella di controllare l'agente utente per vedere se si tratta di IE. Se lo è, quindi verificare la presenza di testo/xml.

Buona fortuna!

Edit:

Opps sul link. La mia impressione era IE è sempre l'aggiunta del / e impostando l'intestazione Accept aggiunge solo il tipo MIME desiderato dopo il /.

+0

Non aggiunge solo il /. In realtà aggiunge: \ */\ * Problema di formattazione nella domanda –

+0

Sì, ho pensato che si trattava di un problema di formattazione ... Ho affrontato la stessa cosa – BStruthers

2

Penso che il poster originale avrebbe potuto fare riferimento a questo collegamento: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx tuttavia, questo non spiega il comportamento che si vede.

IE non ha il comportamento descritto dall'utente e l'impostazione dell'intestazione Accept tramite XMLHTTPRequest dovrebbe funzionare correttamente. Ho testato su IE8 per confermare.

È possibile che ci sia un problema nella tua versione di jQuery, o forse hai qualche plugin che maneggia il tuo traffico?

8

Il problema sembra essere quello descritto qui: http://www.grauw.nl/blog/entry/470. Il problema è che il XMLHttpRequest specification attualmente afferma che i programmi utente non dovrebbero impostare le intestazioni Accept per impostazione predefinita per la richiesta, in modo che req.setRequestHeader() possa solo aggiungere nuovi Accetti. Purtroppo i browser non aderiscono ancora a questo. Il writeup del problema ti consente di testare il tuo browser per vedere se funziona correttamente e sfortunatamente IE7, Chrome, Safari, Firefox e Opera falliscono tutti.

Laurens Grauw parla anche gli effetti del primo tentativo a null l'intestazione Accept con

setRequestHeader('Accept', '') 

o

setRequestHeader('Accept', null) 

Questi potrebbe aiutare qui.

Brutti attacchi server-side: se si ha il controllo della propria app lato server, è possibile cablarla per restituire sempre XML, aggiungere supporto per un tipo di supporto personalizzato come "application/i-really-want-xml" o aggiungi il supporto per un'intestazione HTTP personalizzata come "X-Accept".

+0

setRequestHeader ('Accept', null) dà "tipo mancata corrispondenza" in IE8 Impostarlo su "" prima funziona! – mplungjan

68

Ho anche avuto problemi con questo, non solo in IE ma anche in Chrome e Safari utilizzando jQuery 1.6.2. Questa soluzione sembra funzionare come previsto in tutti i browser che ho provato (Chrome, Safari, IE, Firefox).

$.ajax({ 
    headers: { 
     Accept : "text/plain; charset=utf-8", 
     "Content-Type": "text/plain; charset=utf-8" 
    }, 
    data: "data", 
    success : function(response) { 
     ... 
    } 
}) 

Provate se questo vi dà ancora problemi.

24

utilizzando jQuery 1.5 + è possibile impostare l'accetta intestazioni per dataType in modo da poter fare qualcosa di simile:

$.ajax({ 
    dataType: ($.browser.msie) ? "text" : "xml", 
    accepts: { 
     xml: "text/xml", 
     text: "text/xml" 
    } 
}); 
+0

Dalla fonte di 1.11.1- '\t \t accetta: { \t \t \t "*": ALLTYPES, \t \t \t testo: "text/plain", \t \t \t html: "text/html", \t \t \t xml: "application/xml, text/xml", \t \t \t jSON: "application/json, text/javascript" \t \t},' – nicodemus13

+0

Quindi questi sono i ammette che si prevede un d come sopra devi impostare anche dataType. – nicodemus13

1

Anche se questo non è come la documentazione afferma che deve essere fatto, è ciò che ha funzionato per me .

jQuery.ajax({ 
    type: "POST", 
    url: "...", 
    data: ..., 
    contentType: "text/xml", 
    beforeSend: function(req) { 
    req.setRequestHeader("Accept", "text/xml"); 
    }, ...});