Intestazione della risposta jQuery e AJAX


163

Quindi ho questa chiamata jQuery AJAX e la risposta arriva dal server sotto forma di un reindirizzamento 302. Vorrei 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.

Ecco il codice, se sarà di aiuto:

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

Non ho davvero accesso alle cose sul lato server per spostare l'URL nel corpo della risposta, che so sarebbe la soluzione più semplice, quindi qualsiasi aiuto con l'analisi dell'header sarebbe fantastico.


3
se stai visitando questa domanda nel 2017 o successivamente, ti preghiamo di non perdere tempo con la maggior parte delle risposte esistenti. Se il tuo problema è lo stesso di OP, hai due opzioni: 1) imposta un server proxy che sarà postil server originale ed estrarrà 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,

Risposte:


186

La soluzione di cballou funzionerà se stai usando una vecchia versione di jquery. Nelle versioni più recenti puoi 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'));
   }
  });

Secondo i documenti, l'oggetto XMLHttpRequest è disponibile a partire da jQuery 1.4.


5
A partire da jQuery> = 1.5, dovrebbe essere chiamato jqXHR , che è un superset di un oggetto XHR.
Johan,

136

Se questa è una richiesta CORS , potresti vedere tutte le intestazioni negli strumenti di debug (come Chrome-> Inspect Element-> Network), ma l'oggetto xHR recupererà l'intestazione (tramite xhr.getResponseHeader('Header')) solo se tale intestazione è una semplice intestazione di risposta :

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

Se non si trova in questo set, deve essere presente nell'intestazione Access-Control-Expose-Headers restituita dal server.

Per quanto riguarda il caso in questione, se si tratta di una richiesta CORS, si potrà solo recuperare l' Locationintestazione attraverso l' XMLHttpRequestoggetto se, e solo se, è presente anche l'intestazione seguente:

Access-Control-Expose-Headers: Location

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


3
@acdcjunior grazie che mi ha aiutato anche, dopo che ho investito un po 'di tempo a scoprire perché non c'era risultato nella risposta dell'intestazione
daniyel,

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

1
Non funziona per me. forse sto facendo la richiesta a un altro sito? (richiesta cross site utilizzando ajax)
Siwei Shen

9
Per le persone che non potevano farlo funzionare come me. Probabilmente è perché stai effettuando un accesso interdominio che jquery non utilizza XHR. api.jquery.com/jQuery.get
h - n

Woked like a charm .. +1
ErShakirAnsari

18

La sfortunata verità su AJAX e il reindirizzamento 302 è che non è possibile ottenere le intestazioni dal ritorno perché il browser non le fornisce mai all'XHR. Quando un browser rileva un 302, applica automaticamente il reindirizzamento. In questo caso, vedresti l'intestazione in firebug perché il browser lo ha ricevuto, ma non lo vedresti in ajax, perché il browser non l'ha passato. Questo è il motivo per cui i gestori del successo e 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 di StackOverflow sull'argomento. Alcuni dei post descrivono gli hack per aggirare questo problema.

Come gestire una richiesta di reindirizzamento dopo una chiamata Ajax jQuery

Cattura 302 TROVATA in JavaScript

Reindirizzamento HTTP: 301 (permanente) vs. 302 (temporaneo)


10

L'oggetto XMLHttpRequest sottostante utilizzato da jQuery seguirà sempre silenziosamente i reindirizzamenti 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 inserire tutti i dati in un modulo e inviare il modulo con l' targetattributo impostato sul valore namedell'attributo dell'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 url.dopagina del server verrà caricata nell'iframe, ma quando arriva il suo stato 302, l'iframe verrà reindirizzato alla destinazione finale.


9

prova questo:

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

Hmm. Grazie mille per la risposta, ma sta ancora restituendo null. Altre idee?
Shane,

forse stai usando una vecchia versione di jquery.
Rovsen,

6

AGGIORNAMENTO 2018 PER JQUERY 3 E DOPO

So che questa è una vecchia domanda, ma nessuna delle soluzioni di cui sopra ha funzionato per me. Ecco la soluzione che ha funzionato:

//I only created this function as I am making many ajax calls with different urls and appending the result to different divs
function makeAjaxCall(requestType, urlTo, resultAreaId){
        var jqxhr = $.ajax({
            type: requestType,
            url: urlTo
        });
        //this section is executed when the server responds with no error 
        jqxhr.done(function(){

        });
        //this section is executed when the server responds with error
        jqxhr.fail(function(){

        })
        //this section is always executed
        jqxhr.always(function(){
            console.log("getting header " + jqxhr.getResponseHeader('testHeader'));
        });
    }

2

+1 su PleaseStand ed ecco il mio altro trucco:

dopo aver cercato e scoperto che la "richiesta cross ajax" non riusciva a ottenere le intestazioni di risposta dall'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()  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.