2009-10-13 28 views
126

Tengo esta llamada jQuery AJAX y la respuesta proviene del servidor en forma de redireccionador 302. Me gustaría tomar esta redirección y cargarla en un iframe, pero cuando trato de ver la información del encabezado con una alerta de javascript, aparece nulo, aunque Firebug lo vea correctamente.encabezado de respuesta jQuery y AJAX

Aquí está el código, si va a ayudar:

$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 con el fin de mover el URL para el cuerpo de la respuesta, que sé que sería la solución más fácil, por lo que cualquier ayuda con el análisis del encabezado sería fantástica.

+1

si está visitando esta pregunta en 2017 o posterior, no pierda el tiempo con la mayoría de las respuestas existentes. Si su problema es el mismo que el de OP, tiene dos opciones: 1) configurar un servidor proxy que 'posteará' el servidor original y extraerá los datos de destino y el front-end JS solicitará este servidor proxy para los datos de destino . O bien, 2) cambie el código del servidor para permitir CORS. – kmonsoor

Respuesta

5

probar esto: solución

type: "GET", 
async: false, 
complete: function (XMLHttpRequest, textStatus) { 
    var headers = XMLHttpRequest.getAllResponseHeaders(); 
} 
+0

Hmm. Muchas gracias por la respuesta, pero eso todavía está volviendo nulo. ¿Alguna otra idea? – Shane

+0

quizás esté usando una versión anterior de jquery. – rovsen

28
var geturl; 
    geturl = $.ajax({ 
    type: "GET", 
    url: 'http://....', 
    success: function() { 
     alert("done!"+ geturl.getAllResponseHeaders()); 
    } 
    }); 
+0

no funciona para mí. tal vez estoy haciendo la solicitud a otro sitio? (solicitud de sitio cruzado usando ajax) –

+9

Para las personas que no pueden hacer que funcione como yo. Probablemente sea porque estás haciendo un acceso de dominio cruzado que jquery no usa XHR. http://api.jquery.com/jQuery.get/ –

+1

jqXHR es mejor http://stackoverflow.com/a/4236041/456536 – iwill

137

de cballou funcionará si está utilizando una versión antigua de jQuery. En las versiones más recientes también se puede intentar:

$.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')); 
    } 
    }); 

According to docs el objeto XMLHttpRequest está disponible a partir de jQuery 1.4.

+3

A partir de jQuery> = 1.5, debe llamarse [jqXHR] (http://api.jquery.com/Types/#jqXHR), que es un superconjunto de un objeto XHR. – Johan

8

El objeto subyacente XMLHttpRequest utilizado por jQuery will always silently follow redirects en lugar de devolver un código de estado 302. Por lo tanto, no puede usar la funcionalidad de solicitud AJAX de jQuery para obtener la URL devuelta. En su lugar, es necesario poner todos los datos en un formulario y enviar el formulario con el conjunto target attribute al valor del atributo name 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(); 

página del servidor url.do se cargará en el iframe, pero cuando llegue su estado 302, el iframe será redireccionado al destino final.

0

1 a PleaseStand y aquí está mi otro truco:

después de haber buscado y encontrado que la "petición ajax cruz" no pudo obtener las cabeceras de respuesta desde el objeto XHR, me di por vencido. y use iframe en su lugar.

1. <iframe style="display:none"></iframe> 
2. $("iframe").attr("src", "http://the_url_you_want_to_access") 
//this is my aim!!! 
3. $("iframe").contents().find('#someID').html() 
15

La desafortunada verdad sobre AJAX y la redirección 302 es que no se puede obtener las cabeceras de la vuelta porque el navegador nunca se les da a la XHR. Cuando un navegador ve un 302, automáticamente aplica la redirección. En este caso, vería el encabezado en Firebug porque el navegador lo obtuvo, pero no lo vería en ajax, porque el navegador no lo pasó. Esta es la razón por la cual nunca se llama a los manejadores de errores y de éxito. Solo se llama al manejador 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 algunos anuncios stackoverflow sobre el tema. Algunas de las publicaciones describen hacks para evitar este problema.

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

HTTP redirect: 301 (permanent) vs. 302 (temporary)

114

Si se trata de una CORS request, puede ver todas las cabeceras de herramientas de depuración (como cromadas> Inspeccionar element-> Red), pero el objeto XHR solo recuperará el encabezado (a través de xhr.getResponseHeader('Header')) si dicho encabezado es simple response header:

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

Si no lo es en este conjunto, que debe estar presente en la cabecera Access-Control-Expose-Headers devuelto por el servidor.

Sobre el caso en cuestión, si se trata de una solicitud CORS, uno sólo será capaz de recuperar la cabecera Location a través del objeto XMLHttpRequest si, y sólo si, la cabecera de abajo también está presente:

Access-Control-Expose-Headers: Location 

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

+2

@acdcjunior gracias también me ayudó, después de haber invertido algo de tiempo en descubrir por qué no había salida en la respuesta del encabezado – daniyel

Cuestiones relacionadas