tajuk respons jQuery dan AJAX

163

Jadi saya mendapat panggilan jQuery AJAX ini, dan respons datang dari server dalam bentuk 302 redirect. Saya ingin mengambil pengalihan ini dan memuatnya dalam iframe, tetapi ketika saya mencoba untuk melihat info header dengan peringatan javascript, muncul nol, meskipun firebug melihatnya dengan benar.

Ini kodenya, jika itu akan membantu:

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

Saya tidak benar-benar memiliki akses ke hal-hal di sisi server untuk memindahkan URL ke badan respons, yang saya tahu akan menjadi solusi termudah, jadi setiap bantuan dengan penguraian header akan menjadi fantastis.

Shane
sumber
3
jika Anda mengunjungi pertanyaan ini pada 2017 atau lebih baru, jangan buang waktu dengan sebagian besar jawaban yang ada. Jika masalah Anda sama dengan OP, Anda memiliki dua opsi: 1) menyiapkan server proxy yang akan postmenjadi server asli dan mengekstrak data target dan JS front-end akan meminta server proxy ini untuk data target. Atau, 2) mengubah kode server untuk memungkinkan CORS.
kmonsoor

Jawaban:

186

solusi cballou akan bekerja jika Anda menggunakan versi jquery lama. Di versi yang lebih baru Anda juga dapat mencoba:

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

Menurut dokumen objek XMLHttpRequest tersedia pada jQuery 1.4.

rovsen
sumber
5
Pada jQuery> = 1.5, itu harus disebut jqXHR , yang merupakan superset dari objek XHR.
Johan
136

Jika ini adalah permintaan CORS , Anda mungkin melihat semua tajuk di alat debug (seperti Chrome-> Inspect Element-> Network), tetapi objek xHR hanya akan mengambil tajuk (via xhr.getResponseHeader('Header')) jika tajuk tersebut adalah tajuk respons sederhana :

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

Jika tidak di set ini, itu harus hadir di Access-Control-Expose-Header header dikembalikan oleh server.

Tentang kasus yang dimaksud, jika itu adalah permintaan CORS, seseorang hanya akan dapat mengambil Locationheader melalui XMLHttpRequestobjek jika, dan hanya jika, header di bawah ini juga ada:

Access-Control-Expose-Headers: Location

Jika ini bukan permintaan CORS, XMLHttpRequest akan ada masalah mengambilnya.

acdcjunior
sumber
3
@acdcjunior terima kasih itu membantu saya juga, setelah saya menginvestasikan waktu untuk mencari tahu mengapa tidak ada output dalam respon header
daniyel
33
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });
keithics
sumber
1
tidak bekerja untuk saya. mungkin saya melakukan permintaan ke situs lain? (permintaan lintas situs menggunakan ajax)
Siwei Shen 申思维
9
Untuk orang-orang yang tidak bisa bekerja seperti saya. Mungkin karena Anda melakukan akses lintas domain yang jquery tidak menggunakan XHR. api.jquery.com/jQuery.get
h - n
Terbangun seperti pesona .. +1
ErShakirAnsari
18

Kebenaran yang disayangkan tentang AJAX dan 302 redirect adalah bahwa Anda tidak bisa mendapatkan header dari pengembalian karena browser tidak pernah memberikannya kepada XHR. Ketika browser melihat 302 secara otomatis berlaku pengalihan. Dalam hal ini, Anda akan melihat header di firebug karena browser mendapatkannya, tetapi Anda tidak akan melihatnya di ajax, karena browser tidak melewatinya. Inilah sebabnya mengapa keberhasilan dan penangan kesalahan tidak pernah dipanggil. Hanya penangan lengkap yang dipanggil.

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

Berikut adalah beberapa posting stackoverflow tentang masalah ini. Beberapa pos menggambarkan retasan untuk mengatasi masalah ini.

Cara mengelola permintaan redirect setelah panggilan jQuery Ajax

Menangkap 302 DITEMUKAN dalam JavaScript

Pengalihan HTTP: 301 (permanen) vs. 302 (sementara)

DRaehal
sumber
10

Objek XMLHttpRequest yang digunakan oleh jQuery akan selalu mengikuti arahan ulang tanpa mengembalikan kode status 302. Oleh karena itu, Anda tidak dapat menggunakan fungsionalitas permintaan AJAX jQuery untuk mendapatkan URL yang dikembalikan. Sebagai gantinya, Anda perlu memasukkan semua data ke dalam formulir dan mengirimkan formulir dengan targetatribut disetel ke nilai nameatribut 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();

Halaman server url.doakan dimuat di iframe, tetapi ketika 302 statusnya tiba, iframe akan dialihkan ke tujuan akhir.

PleaseStand
sumber
9

coba ini:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}
Corey Ballou
sumber
Hmm. Terima kasih banyak atas tanggapannya, tetapi itu masih mengembalikan nol. Ada ide lain?
Shane
mungkin Anda menggunakan versi jquery lama.
rovsen
6

PEMBARUAN 2018 UNTUK JQUERY 3 DAN KEMUDIAN

Saya tahu ini adalah pertanyaan lama tetapi tidak ada solusi di atas yang berfungsi untuk saya. Inilah solusi yang berhasil:

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

+1 ke PleaseStand dan ini adalah retasan saya yang lain:

setelah mencari dan menemukan bahwa "permintaan cross ajax" tidak bisa mendapatkan header respons dari objek XHR, saya menyerah. dan gunakan iframe sebagai gantinya.

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()  
Siwei Shen 申思维
sumber