2009-07-17 7 views
72

Estoy tratando de establecer el encabezado HTTP Accept "text/xml" con este código jQuery:no es posible ajustar correctamente la cabecera HTTP Accept 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()); 
    }    
}); 

en Firefox funciona muy bien.

Pero en IE, el valor que intento establecer para el encabezado Accept parece ser anexado al final para que se convierta en: Accept: */*, text/xml. Esto hace que mi llamada ajax devuelva la versión html en lugar de la versión xml que deseo.

¿Alguien sabe cómo configurar/borrar correctamente el encabezado Aceptar en IE 8?

Actualizado: Por alguna razón, los asteriscos no aparecían cuando los ingresé. El encabezado Aceptar en IE parece ser: Accept: */*, text/xml.

Respuesta

0

No creo que IE (ninguna versión) juegue bien con el encabezado Aceptar. Vea este enlace: [http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Una posible solución podría ser comprobar el agente de usuario para ver si se trata de IE. Si es así, compruebe la presencia de texto/xml.

¡Buena suerte!

Editar:

Opps en el enlace. Mi presentimiento era IE siempre está agregando el / y el establecimiento de la cabecera acepte tal y añade el tipo MIME deseado después de la /.

+0

No agrega solo el /. En realidad, agrega: \ */\ * Problema de formato en la pregunta –

+0

Sí, calculé que era un problema de formato ... Me enfrenté a lo mismo – BStruthers

2

Creo que el póster original podría haber estado refiriéndose a este enlace: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx sin embargo, esto no explica el comportamiento que ves.

IE no tiene, por sí mismo, el comportamiento que describe, y la configuración del encabezado Aceptar a través de XMLHTTPRequest debería funcionar correctamente. He probado en IE8 para confirmar.

¿Es posible que exista un problema en su versión de jQuery, o tal vez tenga algún complemento que afecte su tráfico?

8

Su problema parece ser el que se describe aquí: http://www.grauw.nl/blog/entry/470. El problema es que el XMLHttpRequest specification actualmente establece que los agentes de usuario no deben establecer ningún encabezado Aceptar de forma predeterminada para la solicitud, de modo que req.setRequestHeader() solo puede agregar nuevos Aceptados. Lamentablemente, los navegadores aún no se adhieren a esto. La descripción del problema le permite probar su navegador para ver si funciona correctamente y, lamentablemente, IE7, Chrome, Safari, Firefox y Opera fallaron.

Laurens Grauw también habla de los efectos de la primera tratando de anular la cabecera Accept con

setRequestHeader('Accept', '') 

o

setRequestHeader('Accept', null) 

Estos podrían ayudar aquí.

Cortes feos del lado del servidor: si tiene control sobre su aplicación del lado del servidor, puede configurarla siempre para devolver XML, agregar soporte para un tipo de medio personalizado como "application/i-really-want-xml", o agregue soporte para un encabezado HTTP personalizado como "X-Accept".

+0

setRequestHeader ('Aceptar', nulo) da "type mismatch" en IE8 ¡Poniéndolo en "" primeros trabajos! – mplungjan

68

También tuve problemas con esto, no solo en IE sino también en Chrome y Safari usando jQuery 1.6.2. Esta solución parece funcionar como está previsto en todos los navegadores que he probado (Chrome, Safari, IE, Firefox).

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

Intente eso si esto todavía le está causando problemas.

24

Usando jQuery 1.5 + puede establecer la acepta encabezados por dataType lo que puede hacer algo como esto:

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

Desde la fuente de 1.11.1- '\t \t acepta: { \t \t \t "*": ALLTYPES, \t \t \t texto: "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

Así que estos son los que se espera que acepta una d como arriba, debe establecer el tipo de datos también. – nicodemus13

1

Aunque esto no es la forma en la documentación indica que hay que hacer, es lo que funcionó para mí .

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