web-dev-qa-db-fra.com

Comment obtenir le code de statut de réponse de jQuery.ajax?

Dans le code suivant, tout ce que j'essaie de faire est d'obtenir le code de réponse HTTP à partir d'un appel jQuery.ajax. Ensuite, si le code est 301 (déplacé de façon permanente), affichez l'en-tête de réponse 'Location':

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

Est-ce que quelqu'un peut indiquer où je vais mal? Lorsque je vérifie l'objet 'jqxhr' dans Firebug, je ne trouve ni le code d'état ni l'en-tête de réponse 'Location'. J'ai placé le point d'arrêt sur la dernière ligne de 'complete'.

Merci beaucoup.

208
Mahesh

Je vois le champ status sur l'objet jqXhr, voici un violon qui fonctionne:

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

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

Je suis tombé sur cet ancien fil en recherchant moi-même une solution similaire et j'ai trouvé que la réponse acceptée utilisait la méthode .complete() de jquery ajax. Je cite la notice sur site Web jquery ici:

Les rappels jqXHR.success (), jqXHR.error () et jqXHR.complete () sont obsolètes à partir de jQuery 1.8. Pour préparer votre code en vue de son éventuelle suppression, utilisez plutôt jqXHR.done (), jqXHR.fail () et jqXHR.always () .

Pour connaître le status code d'une réponse ajax, on peut utiliser le code suivant:

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

Fonctionne de la même manière pour .done() et .fail()

46
face

Lorsque votre demande XHR renvoie une réponse de redirection (statuts HTTP 301, 302, 303, 307), le XMLHttpRequestsuit automatiquement l'URL redirigée et renvoie le code d'état de cette URL .

Vous pouvez obtenir les codes d’état non redirigés (200, 400, 500, etc.) via la propriété status de l’objet xhr.

Vous ne pouvez donc pas obtenir l'emplacement redirigé à partir de l'en-tête de réponse d'une demande 301, 302, 303 ou 307.

Vous devrez peut-être modifier la logique de votre serveur pour répondre de manière à gérer la redirection plutôt que de laisser le navigateur le faire. Un exemple d'implémentation .

41
Livingston Samuel

JQuery est probablement plus idiomatique d’utiliser la propriété statusCode de l’objet paramètre passé à la fonction $ .ajax:

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

Cependant, comme Livingston Samuel , il n'est pas possible d'attraper 301 codes d'état en javascript.

38
rstackhouse

Vous pouvez vérifier le contenu de votre réponse, il suffit de le faire sur console.log et vous verrez quelle propriété a un code d'état. Si vous ne comprenez pas Jsons, veuillez vous reporter à la vidéo: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Il explique des connaissances de base qui vous permettent de vous sentir plus à l'aise avec JavaScript.

Vous pouvez le faire avec une version plus courte de la requête ajax, veuillez consulter le code ci-dessus:

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

Exemple de sortie de la console:

error 403 
STATUS: Forbidden 
ended
17

jqxhr est un objet json:

retours complets:
L'objet jqXHR (dans jQuery 1.4.x, XMLHTTPRequest) et une chaîne catégorisant le statut de la demande ("succès", "non modifié", "erreur", "délai d'attente", "abandon" ou "parsererror" ").

voir: jQuery ajax

alors vous feriez:

jqxhr.status pour obtenir le statut

4
Neal