Encabezado de respuesta jQuery y AJAX

Resuelto Shane asked hace 14 años • 0 respuestas

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.

Shane avatar Oct 13 '09 07:10 Shane
Aceptado

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.

rovsen avatar Nov 21 '2010 02:11 rovsen

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 Locationencabezado a través del XMLHttpRequestobjeto si, y solo si, el siguiente encabezado también está presente:

Access-Control-Expose-Headers: Location

Si no es una solicitud CORS, XMLHttpRequestno tendrá problemas para recuperarla.

acdcjunior avatar Mar 16 '2013 01:03 acdcjunior
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });
keithics avatar Aug 07 '2010 20:08 keithics

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)

DRaehal avatar Feb 06 '2012 20:02 DRaehal

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 targetatributo establecido en el valor del nameatributo 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.dose cargará en el iframe, pero cuando llegue su estado 302, el iframe será redirigido al destino final.

PleaseStand avatar Nov 21 '2010 02:11 PleaseStand