Jak uzyskać kod statusu odpowiedzi z jQuery.ajax?


230

W poniższym kodzie próbuję tylko uzyskać kod odpowiedzi HTTP z wywołania jQuery.ajax. Następnie, jeśli kod to 301 (Przeniesiony na stałe), wyświetl nagłówek odpowiedzi „Lokalizacja”:

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

Czy ktoś może wskazać, gdzie popełniam błąd? Kiedy sprawdzam obiekt „jqxhr” w Firebug, nie mogę znaleźć kodu statusu ani nagłówka odpowiedzi „Lokalizacja”. Ustawiłem punkt przerwania na ostatnim wierszu „kompletny”.

Dzięki wielkie.



Wiem, że to stare, ale myślę, że je rozwiązałem (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Odpowiedzi:


221

Widzę pole statusu na obiekcie jqXhr, oto skrzynka z działającym:

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
Wygląda na to, że działa w jsFiddle. Na podstawie tego i jQuery documentstion xhr.status powinien robić, co chcę. Jednak gdy próbuję tego samego w moim oryginalnym kodzie (txt_status zastąpiony przez jqxhr.status), wciąż otrzymuję jqxhr.status z 0. Oto zrzut ekranu: twitpic.com/4alsqj
Mahesh

10
Uważam, że problem polega na tym, że nie korzystasz z serwera WWW, ale lokalnie z systemu plików. Myślę, że jeśli uruchomiłeś lokalny serwer WWW, to działałoby poprawnie, oto kilka artykułów na ten temat: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest „Kluczową rzeczą do odnotowania tutaj jest to, że status wyniku jest porównywany z 0 dla sukcesu zamiast z 200. Jest tak, ponieważ schematy plików i ftp nie używają kodów wyników HTTP. ”
Adam Ayres,

to jest świetne. Zwłaszcza, gdy mogę, aby mój backend wysyłał kody stanu.
thatmiddleway

Zauważ, że jeśli odpowiedź ma status przekierowania taki jak 302, da to 200
Księgowy م

52

Przeszedłem przez ten stary wątek, szukając podobnego rozwiązania i znalazłem akceptowaną odpowiedź, która używa .complete()metody jquery ajax. Cytuję ogłoszenie na stronie jquery tutaj:

JqXHR.success () jqXHR.error () i jqXHR.complete () zwrotne są przestarzałe w jQuery 1.8. Aby przygotować kod do ewentualnego usunięcia, użyj jqXHR.done (), jqXHR.fail () i jqXHR.always () .

Aby poznać odpowiedź status codena ajax, można użyć następującego kodu:

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

Działa podobnie dla .done()i.fail()


2
To powraca „nieokreślony”
Pedro Joaquín

43

Prawdopodobnie bardziej idiomatycznym jQuery jest użycie właściwości statusCode obiektu parametru przekazanego do funkcji $ .ajax:

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

Jednak, jak powiedział Livingston Samuel , nie można złapać 301 kodów stanu w javascript.


41

Gdy żądanie XHR zwróci odpowiedź Przekierowanie (stan HTTP 301, 302, 303, 307), XMLHttpRequest automatycznie podąża za przekierowanym adresem URL i zwraca kod stanu tego adresu URL .

Kody stanu bez przekierowywania (200, 400, 500 itd.) Można uzyskać za pośrednictwem statuswłaściwości obiektu xhr.

Nie można więc uzyskać przekierowany lokalizację z nagłówka odpowiedzi z 301, 302, 303lub 307zamówienie.

Być może będziesz musiał zmienić logikę serwera, aby zareagować w sposób umożliwiający obsługę przekierowania, zamiast pozwolić przeglądarce na to. Przykładowa implementacja .


24

Możesz sprawdzić treść odpowiedzi, po prostu console.log, a zobaczysz, że właściwość whitch ma kod statusu. Jeśli nie rozumiesz jsons, zapoznaj się z wideo: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Wyjaśnia bardzo podstawową wiedzę, która pozwala ci czuć się bardziej komfortowo z javascript.

Możesz to zrobić za pomocą krótszej wersji żądania ajax, zobacz kod powyżej:

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

Przykładowe dane wyjściowe konsoli:

error 403 
STATUS: Forbidden 
ended

1
Dziękujemy za dostarczenie pełnego kodu sposobu użycia zrobione, niepowodzenie i zawsze z pełnymi parametrami funkcji.
IvanD

4

jqxhr to obiekt json:

pełne zwroty:
Obiekt jqXHR (w jQuery 1.4.x, XMLHTTPRequest) i ciąg kategoryzujący status żądania („sukces”, „niezmodyfikowany”, „błąd”, „przekroczenie limitu czasu”, „przerwanie” lub „parsererror”) .

patrz: jQuery ajax

więc zrobiłbyś:

jqxhr.status aby uzyskać status


2

NB: Korzystanie z jQuery 3.4.1

$.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);
  }
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.