Yanıt durumu kodu jQuery.ajax'tan nasıl alınır?


230

Aşağıdaki kodda, tüm yapmaya çalıştığım bir jQuery.ajax çağrısından HTTP yanıt kodu almaktır. Ardından, kod 301 ise (Kalıcı Olarak Taşındıysa), 'Konum' yanıt başlığını görüntüleyin:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

Birisi nerede yanlış yaptığımı gösterebilir mi? Firebug'da 'jqxhr' nesnesini kontrol ettiğimde, durum kodunu veya 'Konum' yanıt başlığını bulamıyorum. Kesme noktasını 'tam' son satırına ayarladım.

Çok teşekkürler.



Bunun eski olduğunu biliyorum, ama çözdüğümü düşünüyorum (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Yanıtlar:


221

Durum alanını jqXhr nesnesinde görüyorum, işte bir keman var:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});

2
JsFiddle'da çalışıyor gibi görünüyor. Buna dayanarak ve jQuery documentstion, xhr.status istediğimi yapmalıyım. : Benim özgün kodunda aynı deneyin Ancak, ben bir ekran görüntüsü İşte 0. ait jqxhr.status oluyor almaya devam (txt_status jqxhr.status ile değiştirilir) twitpic.com/4alsqj
Mahesh

10
Sorunun bir web sunucusuna karşı değil, yerel olarak dosya sisteminden çalıştığına inanıyorum. Yerel bir web sunucusunu çalıştırdıysanız, bu düzgün çalışır, işte konu hakkında bazı makaleler var: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "Burada dikkat edilmesi gereken en önemli şey sonuç durumu 200 yerine başarı için 0 ile karşılaştırılıyor. Bunun nedeni, dosya ve ftp şemalarının HTTP sonuç kodlarını kullanmamasıdır. "
Adam Ayres

bu harika. Özellikle arka ucumun durum kodlarını göndermesini sağlayabildiğimde.
thatmiddleway

Yanıt 302 gibi bir yönlendirme durumu ise, bunun 200
Muhasebeci م

52

Bu eski iş parçacığı kendime benzer bir çözüm arıyor geldi ve .complete()yöntemini kullanmak için kabul edilen cevap bulundu jquery ajax. Burada jquery web sitesinde uyarı alıntı :

JqXHR.success (), jqXHR.error () ve jqXHR.complete () geri çağırma edilir kaldırılmış jQuery 1.8 itibarıyla. Kodunuzu nihai olarak kaldırılmak üzere hazırlamak için , bunun yerine jqXHR.done (), jqXHR.fail () ve jqXHR.always () kullanın.

status codeBir ajax yanıtını bilmek için aşağıdaki kod kullanılabilir:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

.done()Ve için benzer şekilde çalışır.fail()


2
Bu "tanımsız" döndürüyor
Pedro Joaquín

43

$ .Ajax işlevine iletilen parametre nesnesinin statusCode özelliğini kullanmak muhtemelen daha deyimsel jQuery'dir:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

Ancak, Livingston Samuel'in dediği gibi, javascript'te 301 durum kodunu yakalamak mümkün değildir.


41

XHR isteğiniz bir Yönlendirme yanıtı döndürdüğünde (HTTP Durumu 301, 302, 303, 307), XMLHttpRequest otomatik olarak yeniden yönlendirilen URL'yi izler ve söz konusu URL'nin durum kodunu döndürür .

Yönlendirme yapmayan durum kodlarını (200, 400, 500 vb.) statusXhr nesnesinin özelliği aracılığıyla alabilirsiniz.

Eğer bir tepki başlığından yönlendirildi yerini alamayan Yani 301, 302, 303veya 307istek.

Tarayıcının yapmasına izin vermek yerine, yönlendirmeyi işleyebileceğiniz bir şekilde yanıt vermek için sunucu mantığınızı değiştirmeniz gerekebilir. Bir örnek uygulama .


24

Belirli içeriğinizi kontrol edebilirsiniz, sadece console.log yazın ve whitch özelliğinin bir durum kodu olduğunu göreceksiniz. Eğer jsons'ı anlamıyorsanız, lütfen videoya bakın: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Javascript ile daha rahat hissetmenizi sağlayan çok temel bilgileri açıklar.

Bunu ajax isteğinin daha kısa bir sürümü ile yapabilirsiniz, lütfen yukarıdaki koda bakın:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

Örnek konsol çıkışı:

error 403 
STATUS: Forbidden 
ended

1
Tam işlev parametreleri ile yapılan, başarısız ve her zaman nasıl kullanılacağının tam kodunu sağladığınız için teşekkür ederiz.
IvanD

4

jqxhr bir json nesnesidir:

tam döndürür:
jqXHR (jQuery 1.4.x, XMLHTTPRequest içinde) nesnesi ve isteğin durumunu kategorize eden bir dize ("başarı", "değiştirilmemiş", "hata", "zaman aşımı", "iptal" veya "ayrıştırıcı") .

bkz: jQuery ajax

böylece yapardınız:

jqxhr.status statü almak


2

Not: jQuery 3.4.1 kullanma

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
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.