Encabezado de respuesta jQuery y AJAX
Entonces tengo esta llamada jQuery AJAX y la respuesta proviene del servidor en forma de redirección 302. Me gustaría tomar esta redirección y cargarla en un iframe, pero cuando intento ver la información del encabezado con una alerta de JavaScript, aparece nulo, aunque Firebug lo ve correctamente.
Aquí está el código, por si te ayuda:
$j.ajax({
type: 'POST',
url:'url.do',
data: formData,
complete: function(resp){
alert(resp.getAllResponseHeaders());
}
});
Realmente no tengo acceso a las cosas del lado del servidor para mover la URL al cuerpo de la respuesta, lo cual sé que sería la solución más sencilla, por lo que cualquier ayuda con el análisis del encabezado sería fantástica.
La solución de cballou funcionará si está utilizando una versión antigua de jquery. En versiones más nuevas también puedes probar:
$.ajax({
type: 'POST',
url:'url.do',
data: formData,
success: function(data, textStatus, request){
alert(request.getResponseHeader('some_header'));
},
error: function (request, textStatus, errorThrown) {
alert(request.getResponseHeader('some_header'));
}
});
Según los documentos, el objeto XMLHttpRequest está disponible a partir de jQuery 1.4.
Si se trata de una solicitud CORS , es posible que vea todos los encabezados en las herramientas de depuración (como Chrome->Inspeccionar elemento->Red), pero el objeto xHR solo recuperará el encabezado (a través de xhr.getResponseHeader('Header')
) si dicho encabezado es un encabezado de respuesta simple :
Content-Type
Last-modified
Content-Language
Cache-Control
Expires
Pragma
Si no está en este conjunto, debe estar presente en el encabezado Access-Control-Expose-Headers devuelto por el servidor.
Sobre el caso en cuestión, si se trata de una solicitud CORS, solo se podrá recuperar el Location
encabezado a través del XMLHttpRequest
objeto si, y solo si, el siguiente encabezado también está presente:
Access-Control-Expose-Headers: Location
Si no es una solicitud CORS, XMLHttpRequest
no tendrá problemas para recuperarla.
var geturl;
geturl = $.ajax({
type: "GET",
url: 'http://....',
success: function () {
alert("done!"+ geturl.getAllResponseHeaders());
}
});
La desafortunada verdad sobre AJAX y la redirección 302 es que no puedes obtener los encabezados de la devolución porque el navegador nunca los entrega al XHR. Cuando un navegador ve un 302, aplica automáticamente la redirección. En este caso, verías el encabezado en Firebug porque el navegador lo obtuvo, pero no lo verías en ajax porque el navegador no lo pasó. Esta es la razón por la que nunca se llama a los controladores de éxito y errores. Sólo se llama al controlador completo.
http://www.checkupdown.com/status/E302.html
The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser
Aquí hay algunas publicaciones de stackoverflow sobre el tema. Algunas de las publicaciones describen trucos para solucionar este problema.
Cómo gestionar una solicitud de redireccionamiento después de una llamada jQuery Ajax
Capturando 302 ENCONTRADO en JavaScript
Redirección HTTP: 301 (permanente) frente a 302 (temporal)
El objeto XMLHttpRequest subyacente utilizado por jQuery siempre seguirá silenciosamente las redirecciones en lugar de devolver un código de estado 302. Por lo tanto, no puede utilizar la funcionalidad de solicitud AJAX de jQuery para obtener la URL devuelta. En su lugar, debe colocar todos los datos en un formulario y enviarlo con el target
atributo establecido en el valor del name
atributo del iframe:
$('#myIframe').attr('name', 'myIframe');
var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);
form.appendTo(document.body);
form.submit();
La página del servidor url.do
se cargará en el iframe, pero cuando llegue su estado 302, el iframe será redirigido al destino final.