web-dev-qa-db-fra.com

Comment obtenir le code de statut HTTP avec jQuery?

Je souhaite vérifier si une page renvoie le code d'état 401. Est-ce possible?

Voici mon essai, mais il ne retourne que 0.

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
    alert(xhr.status); 
    }
});
63
horgen

c'est possible avec la méthode jQuery $.ajax()

$.ajax(serverUrl, {
   type: OutageViewModel.Id() == 0 ? "POST" : "PUT",
   data: dataToSave,
   statusCode: {
      200: function (response) {
         alert('1');
         AfterSavedAll();
      },
      201: function (response) {
         alert('1');
         AfterSavedAll();
      },
      400: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      },
      404: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      }
   }, success: function () {
      alert('1');
   },
});
89
Ravi Mittal

Le troisième argument est l'objet XMLHttpRequest, vous pouvez donc faire ce que vous voulez.

$.ajax({
  url  : 'http://example.com',
  type : 'post',
  data : 'a=b'
}).done(function(data, statusText, xhr){
  var status = xhr.status;                //200
  var head = xhr.getAllResponseHeaders(); //Detail header info
});
61
b123400

Utilisez le rappel d'erreur.

Par exemple:

jQuery.ajax({'url': '/this_is_not_found', data: {}, error: function(xhr, status) {
    alert(xhr.status); }
});

Va alerter 404

20
baloo

J'ai trouvé cette solution où vous pouvez simplement vérifier le code de réponse du serveur en utilisant code d'état.

Exemple :

$.ajax({
type : "POST",
url : "/package/callApi/createUser",
data : JSON.stringify(data),
contentType: "application/json; charset=UTF-8",
success: function (response) {  
    alert("Account created");
},
statusCode: {
    403: function() {
       // Only if your server returns a 403 status code can it come in this block. :-)
        alert("Username already exist");
    }
},
error: function (e) {
    alert("Server error - " + e);
} 
});
7
Jigar Trivedi

Je pense que vous devriez également implémenter la fonction d'erreur de la méthode $. Ajax .

error (XMLHttpRequest, textStatus, errorThrown) Fonction

Une fonction à appeler si la requête échoue. Trois arguments sont transmis à la fonction: l'objet XMLHttpRequest, une chaîne décrivant le type d'erreur survenue et un objet exception facultatif, le cas échéant. Les valeurs possibles pour le deuxième argument (outre null) sont "timeout", "erreur", "non modifié" et "parsererror".

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
        alert(xhr.status); 
    },
    error: function(xhr, statusText, err){
        alert("Error:" + xhr.status); 
    }
});
7
GvS
$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    error: function(xhr, statusText, errorThrown){alert(xhr.status);}
});
6
vartec

J'encapsule le jQuery Ajax à une méthode:

var http_util = function (type, url, params, success_handler, error_handler, base_url) {

    if(base_url) {
        url = base_url + url;
    }

    var success = arguments[3]?arguments[3]:function(){};
    var error = arguments[4]?arguments[4]:function(){};



    $.ajax({
        type: type,
        url: url,
        dataType: 'json',
        data: params,
        success: function (data, textStatus, xhr) {

            if(textStatus === 'success'){
                success(xhr.code, data);   // there returns the status code
            }
        },
        error: function (xhr, error_text, statusText) {

            error(xhr.code, xhr);  // there returns the status code
        }
    })

}

Usage:

http_util('get', 'http://localhost:8000/user/list/', null, function (status_code, data) {
    console(status_code, data)
}, function(status_code, err){
    console(status_code, err)
})
3
aircraft

J'ai eu des problèmes majeurs avec ajax + jQuery v3, qui obtenait à la fois le code d'état de la réponse et les données des API JSON. jQuery.ajax ne décode les données JSON que si l'état est correct. Il bascule également dans l'ordre des paramètres de rappel en fonction du code d'état. Ugghhh.

La meilleure façon de lutter contre cela est d'appeler le .always méthode de la chaîne et faire un peu de nettoyage. Voici mon code.

$.ajax({
        ...
    }).always(function(data, textStatus, xhr) {
        var responseCode = null;
        if (textStatus === "error") {
            // data variable is actually xhr
            responseCode = data.status;
            if (data.responseText) {
                try {
                    data = JSON.parse(data.responseText);
                } catch (e) {
                    // Ignore
                }
            }
        } else {
            responseCode = xhr.status;
        }

        console.log("Response code", responseCode);
        console.log("JSON Data", data);
    });
0
Phil