jQuery ve AJAX yanıt başlığı


163

Bu jQuery AJAX çağrısını aldım ve yanıt sunucudan 302 yönlendirmesi şeklinde geliyor. Bu yönlendirmeyi alıp bir iframe'e yüklemek istiyorum, ancak başlık bilgilerini bir javascript uyarısıyla görüntülemeye çalıştığımda, kundakçı doğru görse bile boş görünüyor.

Yardımcı olacaksa kod İşte:

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

URL'yi en kolay çözüm olacağını bildiğim yanıt gövdesine taşımak için gerçekten sunucu tarafı şeylere erişimim yok, bu nedenle üstbilginin ayrıştırılmasıyla ilgili herhangi bir yardım harika olurdu.


3
Bu soruyu 2017'de veya daha sonra ziyaret ediyorsanız, lütfen mevcut cevapların çoğuyla zaman kaybetmeyin. Sorununuz OP ile aynıysa, iki seçeneğiniz vardır: 1) postorijinal sunucuyu ve hedef verileri ayıklayacak bir proxy sunucu oluşturun ve ön uç JS bu proxy sunucusunu hedef veriler için isteyecektir. Veya, 2) CORS'a izin vermek için sunucunun kodunu değiştirin.
kmonsoor

Yanıtlar:


186

jquery'nin eski bir sürümünü kullanıyorsanız cballou'nun çözümü işe yarayacaktır. Daha yeni sürümlerde şunları da deneyebilirsiniz:

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

Dokümanlara göre XMLHttpRequest nesnesi jQuery 1.4'ten itibaren kullanılabilir.


5
JQuery> = 1.5 itibarıyla , bir XHR nesnesinin üst kümesi olan jqXHR olarak adlandırılmalıdır .
Johan

136

Bu bir CORS isteğiyse, hata ayıklama araçlarında tüm başlıkları görebilirsiniz (Chrome-> Inspect Element-> Network gibi), ancak xHR nesnesi yalnızca xhr.getResponseHeader('Header')böyle bir üstbilgi basit bir yanıt üstbilgisi ise üstbilgiyi (üzerinden ) alır :

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

Bu kümede yoksa , sunucu tarafından döndürülen Access-Control-Expose-Headers başlığında bulunmalıdır .

Söz konusu vaka hakkında, bu bir CORS isteği ise, üstbilgi yalnızca nesne Locationüzerinden XMLHttpRequestve ancak aşağıdaki üstbilginin de mevcut olması durumunda alınabilir :

Access-Control-Expose-Headers: Location

Bir CORS isteği değilse, onu almakta XMLHttpRequestsorun olmaz.


3
@acdcjunior teşekkür ederim, başlık tepkisinde neden çıktı olmadığını öğrenmek için biraz zaman harcadıktan sonra da bana yardımcı oldu
daniyel

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

1
benim için çalışmıyor. belki başka bir siteye istekte bulunuyorum? (ajax kullanarak siteler arası istek)
Siwei Shen 申思维

9
Bunu yapamayan insanlar benim gibi çalışır. Muhtemelen jquery XHR kullanmayan bir etki alanları arası erişim yapıyorsunuz. api.jquery.com/jQuery.get
h - n

Woked like a charm .. +1
ErShakirAnsari

18

AJAX ve 302 yönlendirmesi hakkındaki talihsiz gerçek, tarayıcıları asla XHR'ye vermediğinden, üstbilgileri dönüşten alamamanızdır. Bir tarayıcı bir 302 gördüğünde otomatik olarak yönlendirmeyi uygular. Bu durumda, tarayıcıyı aldığından başlığı kundakta görürsünüz, ancak tarayıcıda geçmediği için ajax'ta göremezsiniz. Bu yüzden başarı ve hata işleyicileri asla çağrılmaz. Yalnızca tam işleyici çağrılır.

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

İşte konu ile ilgili bazı yığın akışı yazıları. Bazı gönderiler bu sorunu çözmek için kesmek açıklar.

Bir jQuery Ajax çağrısından sonra yönlendirme isteği nasıl yönetilir

JavaScript'te 302 FOUND yakalamak

HTTP yönlendirmesi: 301 (kalıcı) ve 302 (geçici)


10

JQuery tarafından kullanılan temel XMLHttpRequest nesnesi , 302 durum kodu döndürmek yerine her zaman sessizce yönlendirmeleri izler . Bu nedenle, döndürülen URL'yi almak için jQuery'nin AJAX istek işlevini kullanamazsınız. Bunun yerine, tüm verileri bir forma koymanız ve targetözniteliği ayarlanmış formu nameiframe özniteliğinin değerine göndermeniz gerekir :

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

Sunucunun url.dosayfası iframe'e yüklenir, ancak 302 durumu geldiğinde iframe son hedefe yönlendirilir.


9

bunu dene:

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

Hmm. Yanıt için çok teşekkürler, ama yine de null döndürüyor. Başka fikir var mı?
Shane

belki jquery eski bir sürümünü kullanıyorsunuz.
rovsen

6

JQUERY 3 VE SONRASI İÇİN GÜNCELLEME 2018

Bunun eski bir soru olduğunu biliyorum, ancak yukarıdaki çözümlerin hiçbiri benim için işe yaramadı. İşte işe yarayan çözüm:

//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

PleaseStand için +1 ve işte benim diğer kesmek:

arama ve "çapraz ajax isteği" XHR nesnesinden yanıt üstbilgileri alamadım sonra, vazgeçti bulundu. ve bunun yerine iframe kullanın.

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()  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.