2009-10-13 7 views
126

Quindi ho questa chiamata jQuery AJAX e la risposta proviene dal server sotto forma di reindirizzamento 302. Mi piacerebbe prendere questo reindirizzamento e caricarlo in un iframe, ma quando provo a visualizzare le informazioni dell'intestazione con un avviso javascript, viene visualizzato null, anche se Firebug lo vede correttamente.intestazione risposta jQuery e AJAX

Ecco il codice, se ti aiuto:

$j.ajax({ 
    type: 'POST', 
    url:'url.do', 
    data: formData, 
    complete: function(resp){ 
     alert(resp.getAllResponseHeaders()); 
    } 
}); 

Io in realtà non hanno accesso alla roba lato server al fine di spostare l'URL del corpo della risposta, che so sarebbe la soluzione più semplice, quindi qualsiasi aiuto con l'analisi dell'intestazione sarebbe fantastico.

+1

se stai visitando questa domanda nel 2017 o dopo, per favore non perdere tempo con la maggior parte delle risposte esistenti. Se il tuo problema è uguale a OP, hai due opzioni: 1) configura un server proxy che "post" il server originale ed estrae i dati di destinazione e JS front-end richiederà questo server proxy per i dati di destinazione . Oppure, 2) modificare il codice del server per consentire CORS. – kmonsoor

risposta

5

provare questo: soluzione

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

Hmm. Grazie mille per la risposta, ma restituisce ancora null. Altre idee? – Shane

+0

forse stai usando una vecchia versione di jQuery. – rovsen

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

non funziona per me. forse sto facendo la richiesta ad un altro sito? (cross site request using ajax) –

+9

Per le persone che non potevano farlo funzionare come me. Probabilmente è perché stai facendo un accesso interdominio che jquery non usa XHR. http://api.jquery.com/jQuery.get/ –

+1

jqXHR è migliore http://stackoverflow.com/a/4236041/456536 – iwill

137

di cballou funzionerà se si utilizza una vecchia versione di jQuery. Nelle versioni più recenti si può anche provare:

$.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 l'oggetto XMLHttpRequest è disponibile come di jQuery 1.4.

+3

A partire da jQuery> = 1.5, dovrebbe essere chiamato [jqXHR] (http://api.jquery.com/Types/#jqXHR), che è un superset di un oggetto XHR. – Johan

8

L'oggetto XMLHttpRequest sottostante utilizzato da jQuery will always silently follow redirects anziché restituire un codice di stato 302. Pertanto, non è possibile utilizzare la funzionalità di richiesta AJAX di jQuery per ottenere l'URL restituito. Invece, è necessario mettere tutti i dati in un modulo e inviare il modulo con il set target attribute al valore dell'attributo 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(); 

page del server di url.do sarà caricato nel iframe, ma quando arriva lo stato 302, l'iframe verrà reindirizzato alla destinazione finale.

0

+1 a PleaseStand e qui è la mia altra mod:

dopo la ricerca e ha scoperto che la "richiesta AJAX croce" non ha potuto ottenere le intestazioni di risposta da oggetto XHR, ho rinunciato. e usa invece iframe.

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 triste verità su AJAX e il reindirizzamento 302 è che non è possibile ottenere le intestazioni dal ritorno perché il browser non li dà al XHR. Quando un browser vede un 302 applica automaticamente il reindirizzamento. In questo caso, vedresti l'intestazione in firebug perché il browser l'ha ricevuta, ma non la vedresti in ajax, perché il browser non l'ha passato. Questo è il motivo per cui il successo e il gestore degli errori non vengono mai chiamati. Viene chiamato solo il gestore 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 

Ecco alcuni post StackOverflow sull'argomento. Alcuni post descrivono gli hack per ovviare a questo 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

Se questo è un CORS request, è possibile visualizzare tutte le intestazioni di strumenti di debug (come Cromo> Ispezionare elemento-> Network), ma l'oggetto XHR recupererà l'intestazione (tramite xhr.getResponseHeader('Header')) se tale intestazione è un simple response header:

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

Se non è in questo insieme, deve essere presente nel Access-Control-Expose-Headers intestazione restituito dal server.

sul caso in questione, se si tratta di una richiesta CORS, uno solo sarà in grado di recuperare il Location intestazione attraverso l'oggetto XMLHttpRequest se, e solo se, l'intestazione di sotto è presente anche:

Access-Control-Expose-Headers: Location 

Se non è una richiesta CORS, XMLHttpRequest non avrà problemi a recuperarlo.

+2

@acdcjunior grazie che mi ha aiutato anche, dopo che ho investito del tempo per scoprire perché non c'era uscita nella risposta dell'intestazione – daniyel