Question Comment puis-je obtenir le code d'état de réponse HTTP dans AngularJS 1.2?


En utilisant ngResource dans AngularJS 1.2rc (x), comment puis-je obtenir le code de statut maintenant?

RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});

RestAPI est mon ngResource.

La réponse a la $promise objet et la ressource retournée par le serveur mais pas un statut plus. le responseHeaders() La fonction a seulement un statut si le serveur injecte le code d'état dans l'objet d'en-tête, mais pas le code d'état renvoyé. Ainsi, certains serveurs peuvent le servir et d'autres pas.


25
2017-09-10 22:07


origine


Réponses:


Vous pouvez utiliser les rappels promis then, catch et finally après le $resource appel.

Par exemple. Si vous voulez attraper une erreur après un appel, vous feriez quelque chose comme ceci:

RestAPI.save({resource}, {data}, callbackFunction).$promise.catch(function(response) {
    //this will be fired upon error
    if(response.status == 500) alert('Something baaad happend');
}).then(function() {
    //this will be fired upon success
});

le response objet aura status et le statusText Propriétés. status être un code d'état entier et statusText le texte. Vous aurez aussi le data propriété contenant la réponse du serveur.

edit: comme suggéré, c'était response.status


12
2017-07-16 22:31



Vous devez ajouter un intercepteur dans votre déclaration de ressource. Comme ça:

var resource = $resource(url, {}, {
    get: {
        method: 'GET'
        interceptor: {
            response: function(response) {      
                var result = response.resource;        
                result.$status = response.status;
                return result;
            }
        }
    }                            
});

Usage:

resource.get(params, function(result) {
    console.log(result.$status)
});

Le code de statut IMO aurait dû être fourni par défaut. Il y a un problème pour cela https://github.com/angular/angular.js/issues/8341


11
2018-04-03 16:25



Pour quiconque utilise une version plus récente d’Angular, il semblerait que nous ayons accès au code de statut en tant que 3ème paramètre du transformResponse fonction depuis angulaire 1.3, mais il n'a jamais été documenté correctement dans le ressource $ docs


4
2018-02-10 01:12



j'ai été d'accord responseHeaders() function ne renverra que l'en-tête de la réponse, mais vous pouvez le personnaliser et il est utile de toute façon.

1.

Pour résoudre votre problème. Avec ce qui suit :($$service est mon instance de ressource $.)

var serve = new $$service();
serve.id = "hello_wrongPath"; // wrong path,will return 404
serve.$get()
    .then(function (data) {
        console.log("~~~hi~~~");
        console.log(data);
        return data;
    })
    .catch(function (error) {
        console.log("~~~error~~~");
        console.log(error);
        console.log(error.status); // --> 404
        console.log(error.statusText); // --> "Not Found"
        console.log(error.config.timeout); // --> 5000
        console.log(error.config.method); // --> GET
        console.log(error.config.url); // --> request url
        console.log(error.headers("content-type"));// --> "text/plain"
        return error.$promise;
    })
    .finally(function(data){
        console.log("~~~finally~~~");
        console.log(data); // --> undefined
    });

De cette façon, vous ne pouvez attraper que status,statusText,timeout,method,headers(same with responseHeaders) en réponse ERROR.

2.

Si vous voulez voir les détails de la réponse dans une réponse réussie, j'ai utilisé un intercepteur comme celui-ci:

ng.module("baseInterceptor", [])
    .factory("baseInterceptor", ["$q", function ($q) {
        return {
            'request': function (config) {
                console.info(config);
                //set timeout for all request
                config.timeout = 5000;
                return config;
            },
            'requestError': function (rejection) {
                console.info(rejection);
                return $q.reject(rejection);
            },
            'response': function (response) {
                console.log("~~interceptor response success~~");
                console.log(response);
                console.log(response.status);
                console.log(response.config.url);
                return response;
            },
            'responseError': function (rejection) {
                console.log("~~interceptor response error~~");
                console.log(rejection);
                console.log(rejection.status);
                return $q.reject(rejection);
            }
        };
    }]);

puis ajoutez un intercepteur au module:

.config(["$httpProvider", function ($httpProvider) {
    $httpProvider.interceptors.push("baseInterceptor");
}])

3
2017-11-10 06:04



Vous pouvez obtenir le statut de réponse comme ceci:

$http.get(url).then(function(response){
  console.log(response.status); //successful status like OK
}, function(response){
  console.log(response.status); //error status like 400-Bad Request
})


2
2018-06-28 11:26



J'utilise AngularJS v1.5.6, et je le fais comme ça (dans mon cas, je mets la méthode "getData" dans un service):

function getData(url) {
    return $q(function (resolve, reject) {
        $http.get(url).then(success, error);

        function success(response) {
            resolve(response);
        }
        function error(err) {
            reject(err);
        }
    });
}

puis dans le contrôleur (par exemple), appelez comme ceci:

function sendGetRequest() {
    var promise = service.getData("someUrlGetService");
    promise.then(function(response) {
        //do something with the response data
        console.log(response.data);
    }, function(response) {
        //do something with the error
        console.log('Error status: ' + response.status);
    });
}

Comme l'indique la documentation, l'objet de réponse possède les propriétés suivantes:

  • data - {string | Object} - Le corps de la réponse transformé avec les fonctions de transformation.
  • status - {number} - Code d'état HTTP de la réponse.
  • headers - {function ([headerName])} - Fonction getter en-tête.
  • config - {Object} - Objet de configuration utilisé pour générer la requête.
  • statusText - {string} - Texte d'état HTTP de la réponse.

Voir https://docs.angularjs.org/api/ng/service/$http

J'espère que cela aide!


0
2017-08-29 17:03



Je pense que la bonne réponse est une combinaison des réponses de Bardiel et d'Ara.

Après avoir ajouté un intercepteur dans votre déclaration de ressource. Comme ça:

var resource = $resource(url, {}, {
    get: {
        method: 'GET'
        interceptor: {
            response: function(response) {      
                var result = response.resource;        
                result.$status = response.status;
                return result;
            }
        }
    }                            
});

Utilisez-le comme ci-dessous:

RestAPI.save()
.query(function(response) {
    // This will return status code from API like 200, 201 etc
    console.log(response.$status);
})
.$promise.catch(function(response) {
    // This will return status code from server side like 404, 500 etc
    console.log(response.status);
});

0
2017-12-08 10:14