260 votes

Comment obtenir le code d'état de réponse à partir de jQuery.ajax?

Dans le code suivant, tout ce que je suis en train de faire est d'obtenir le code de réponse HTTP à partir d'un jQuery.appel ajax. Ensuite, si le code est de 301 (redirection Permanente), affichage de la "Localisation" en-tête de réponse:

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

Quelqu'un peut-il point où je vais mal? Quand j'ai cocher la case "jqxhr' objet dans Firebug, je ne trouve pas le code d'état, ni de la "Localisation" en-tête de réponse. Je définir le point d'arrêt sur la dernière ligne de "complète".

Merci beaucoup.

250voto

Adam Ayres Points 3664

Je vois le champ état de l'jqXhr objet, ici, est un violon avec:

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

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

56voto

face Points 695

Suis tombé sur ce vieux thread recherche d'une solution similaire moi-même et trouvé la accepté de répondre à l'aide de .complete() méthode de jquery ajax. Je cite l'avis sur jquery site ici:

Le jqXHR.success(), jqXHR.erreur(), et jqXHR.complet() rappels sont obsolètes comme de jQuery 1.8. Pour préparer votre code pour leur éventuelle suppression, l'utilisation jqXHR.done(), jqXHR.fail(), et jqXHR.toujours() à la place.

Pour connaître le status code d'un ajax réponse, 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()

55voto

rstackhouse Points 490

Il est probablement plus idiomatiques jQuery pour utiliser le statusCode propriété de l'objet passé en paramètre à l' $.ajax fonction:

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

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

43voto

Livingston Samuel Points 1762

Lorsque votre demande XHR renvoie une réponse de Redirection (code HTTP 301, 302, 303, 307), l' XMLHttpRequest suit automatiquement la redirection d'URL et retourne le code de statut de cette URL.

Vous pouvez obtenir le non-réorientation des codes d'état (200, 400, 500, etc) via l' status de la propriété de l'objet xhr.

Si vous ne pouvez pas obtenir l'emplacement redirigé à partir de l'entête de la réponse d'un 301, 302, 303 ou 307 la demande.

Vous pourriez avoir à changer votre serveur logique pour répondre d'une manière que vous pouvez gérer la redirection, plutôt que de laisser le navigateur. Un exemple de mise en œuvre.

4voto

Neal Points 68710

jqxhr est un objet json:

complète retourne:
Le jqXHR (en jQuery 1.4.x, XMLHTTPRequest) objet et une chaîne la catégorisation de l'état de la demande ("succès", "notmodified", "erreur", "délai d'attente", "abandon", ou "parsererror").

voir: jQuery ajax

donc, vous ne:

jqxhr.status pour obtenir le statut

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X