it-swarm.com.de

jQuery und AJAX Antwortheader

Ich habe also diesen Aufruf von jQuery AJAX, und die Antwort kommt vom Server in Form einer 302-Umleitung. Ich würde diese Umleitung gerne nehmen und in einen iframe laden, aber Wenn ich versuche, die Header-Informationen mit einer JavaScript-Warnung anzuzeigen, wird sie als null angezeigt, obwohl Firebug sie korrekt erkennt.

Ist hier der Code, wenn es hilft:

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

Ich habe nicht wirklich Zugriff auf die serverseitigen Inhalte, um die URL in den Antworttext zu verschieben. Ich weiß, dass dies die einfachste Lösung ist. Daher wäre jede Hilfe beim Parsen des Headers fantastisch.

151
Shane

die Lösung von cballou funktioniert, wenn Sie eine alte Version von jquery verwenden. In neueren Versionen können Sie auch versuchen:

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

Laut docs Das XMLHttpRequest-Objekt ist ab jQuery 1.4 verfügbar.

168
rovsen

Wenn dies eine CORS-Anfrage ist, werden möglicherweise alle Header in Debug-Tools angezeigt (z. B. Chrome-> Inspect Element-> Network), das xHR-Objekt ruft jedoch nur den Header ab (über xhr.getResponseHeader('Header')) wenn ein solcher Header ein einfacher Antwortheader ist:

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

Wenn es nicht in dieser Gruppe enthalten ist, muss es im Header Access-Control-Expose-Headers vorhanden sein, der vom Server zurückgegeben wird.

Wenn es sich um eine CORS-Anfrage handelt, kann der Location -Header nur dann über das XMLHttpRequest -Objekt abgerufen werden, wenn auch der folgende Header vorhanden ist:

Access-Control-Expose-Headers: Location

Wenn es sich nicht um eine CORS-Anforderung handelt, kann XMLHttpRequest sie problemlos abrufen.

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

Die unglückliche Wahrheit über AJAX und die Weiterleitung 302 ist, dass Sie die Header nicht aus der Rückgabe erhalten können, weil der Browser sie niemals an die XHR weiterleitet. Wenn ein Browser eine 302 sieht, wendet er automatisch die In diesem Fall würden Sie den Header in Firebug sehen, weil der Browser ihn erhalten hat, aber Sie würden ihn nicht in Ajax sehen, weil der Browser ihn nicht bestanden hat Der vollständige Handler wird aufgerufen.

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

Hier sind einige Stackoverflow-Posts zu diesem Thema. Einige der Beiträge beschreiben Hacks, um dieses Problem zu umgehen.

So verwalten Sie eine Umleitungsanforderung nach einem jQuery Ajax-Aufruf

Fang 302 in JavaScript GEFUNDEN

HTTP-Weiterleitung: 301 (permanent) vs. 302 (temporär)

17
DRaehal

Das zugrunde liegende XMLHttpRequest-Objekt, das von jQuery verwendet wird, folgt immer stillschweigend Weiterleitungen , anstatt einen 302-Statuscode zurückzugeben. Daher können Sie die AJAX - Anforderungsfunktionalität von jQuery nicht verwenden, um die zurückgegebene URL abzurufen. Stattdessen müssen Sie alle Daten in ein Formular einfügen und das Formular mit target Attribut gesetzt auf den Wert des name Attributs des iframes:

$('#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();

Der Server ist url.do Seite wird in den Iframe geladen, aber wenn sein 302 Status eintrifft, wird der Iframe zum endgültigen Ziel umgeleitet.

9
PleaseStand

versuche dies:

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

+1 an PleaseStand und hier ist mein anderer Hack:

nachdem ich gesucht hatte und festgestellt hatte, dass die "Cross Ajax Request" keine Antwort-Header vom XHR-Objekt erhalten konnte, gab ich auf. und benutze stattdessen 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()  

PDATE 2018 FÜR JQUERY 3 UND SPÄTER

Ich weiß, dass dies eine alte Frage ist, aber keine der oben genannten Lösungen hat für mich funktioniert. Hier ist die Lösung, die funktioniert hat:

//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'));
        });
    }
1
sticky_elbows