example - jquery ajax get
No se puede configurar correctamente el encabezado HTTP Aceptar con jQuery (6)
Aunque esta no es la forma en que la documentación indica que debe hacerse, es lo que funcionó para mí.
jQuery.ajax({
type: "POST",
url: "...",
data: ...,
contentType: "text/xml",
beforeSend: function(req) {
req.setRequestHeader("Accept", "text/xml");
}, ...});
Estoy intentando configurar el encabezado HTTP Aceptar en "texto / xml" con este código 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 genial.
Pero en IE, el valor que intento establecer para el encabezado Accept parece ser anexado al final, por lo que se convierte 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
.
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í solo, el comportamiento que describes, y configurar el 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.
No creo que IE (ninguna versión) juegue bien con el encabezado Aceptar. Ver este enlace: [ http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]
Una posible solución podría ser verificar el agente de usuario para ver si es IE. Si es así, compruebe la presencia de texto / xml.
¡Buena suerte!
Editar:
Opps en el enlace. Mi corazonada era que IE siempre agregaba / y al configurar el encabezado de aceptar solo agrega el tipo de mime deseado después de / .
Su problema parece ser el que se describe aquí: http://www.grauw.nl/blog/entry/470 . El problema es que la especificación XMLHttpRequest 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 sobre los efectos de intentar primero anular el encabezado Accept con
setRequestHeader(''Accept'', '''')
o
setRequestHeader(''Accept'', null)
Esto podría ayudar aquí.
Horribles ataques en el lado del servidor: si tienes control sobre tu aplicación del lado del servidor, puedes configurarla para que siempre devuelva XML, agregar soporte para un tipo de medio personalizado como "application / i-really-want-xml", o agregar soporte para un encabezado HTTP personalizado como "X-Accept".
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) {
...
}
})
Intenta eso si esto todavía te está dando problemas.
Usando jQuery 1.5+ puede establecer los encabezados de dataType
por dataType
para que pueda hacer algo como esto:
$.ajax({
dataType: ($.browser.msie) ? "text" : "xml",
accepts: {
xml: "text/xml",
text: "text/xml"
}
});