Подтвердить что ты не робот

Как получить код статуса ответа HTTP в AngularJS 1.2

Используя ngResource в AngularJS 1.2rc (x), как мне получить код состояния сейчас?

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

где RestAPI - мой ngResource.

Ответ имеет объект $promise и ресурс, возвращенный с сервера, но не статус. Функция responseHeaders() имеет только статус, если сервер вводит код состояния в объект заголовка, но не возвращает истинный код состояния. Поэтому некоторые серверы могут обслуживать его, а некоторые - нет.

4b9b3361

Ответ 1

Вы можете использовать promiss callbacks then, catch и finally после вызова $resource.

Например. Если вы хотите поймать ошибку после вызова, вы бы сделали что-то вроде этого:

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
});

Объект response будет иметь свойства status и statusText. status - целочисленный код состояния и statusText текст. У вас также будет свойство data, содержащее ответ сервера.

edit: как было предложено, это было response.status

Ответ 2

Вы должны добавить перехватчик внутри объявления ресурса. Вот так:

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

Использование:

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

Код состояния IMO должен был быть предоставлен по умолчанию. Для этого есть проблема https://github.com/angular/angular.js/issues/8341

Ответ 3

Для всех, кто использует более новую версию Angular, похоже, что у нас был доступ к коду состояния как третий параметр функции transformResponse с angular 1.3, но он никогда не был документально подтвержден в $resource docs.

Ответ 4

Я согласился responseHeaders() функция вернет ответный заголовок, но вы можете его настроить, и он будет полезен в любом случае.

1.

Чтобы решить вашу проблему. Со следующим: ($$service - мой экземпляр ресурса $.)

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
    });

Таким образом, u может только улавливать status,statusText,timeout,method,headers(same with responseHeaders) в ответе ERROR.

2.

Если вы хотите увидеть ответную информацию в ответе на успех, я использовал такой перехватчик:

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);
            }
        };
    }]);

а затем добавьте перехватчик в модуль:

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

Ответ 5

Вы можете получить статус ответа следующим образом:

$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
})

Ответ 6

Я думаю, что правильный ответ - это сочетание ответов Бардиэля и Ара.

После добавления перехватчика внутри объявления ресурса. Вот так:

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

Используйте его, как показано ниже:

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);
});

Ответ 7

Я использую AngularJS v1.5.6, и я делаю это так (в моем случае я помещаю метод getData внутри службы):

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

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

то в контроллере (например) вызовите это следующим образом:

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);
    });
}

Как говорится в документации, объект ответа имеет следующие свойства:

  • data - {string | Object} - тело ответа, преобразованное с помощью функций преобразования.
  • status - {number} - код состояния HTTP для ответа.
  • headers - {function ([headerName])} - функция получателя заголовка.
  • config - {Object} - объект конфигурации, который использовался для генерации запроса.
  • statusText - {string} - текст ответа HTTP-ответа.

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

Надеюсь, что это поможет!

Ответ 8

Я столкнулся с аналогичной проблемой. Я заглянул в библиотеку angular и добавил несколько строк, чтобы получить статус, возвращенный в самом ответе. В этом файле найдите, где обещание возвращается.

Замените блок кода, начиная с

var prom = $http (httpConfig). then (функция (ответ)

со следующим

var promise = $http(httpConfig).then(function(response) {
            var data = response.data,
                promise = value.$promise;

            if (data) {
              // Need to convert action.isArray to boolean in case it is undefined
              // jshint -W018
              if ( angular.isArray(data) !== (!!action.isArray) ) {
                throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected ' +
                  'response to contain an {0} but got an {1}',
                  action.isArray?'array':'object', angular.isArray(data)?'array':'object');
              }
              // jshint +W018
              if (action.isArray) {
                value.length = 0;
                forEach(data, function(item) {
                  value.push(new Resource(item));
                });
              } else {
                copy(data, value);
                value.$promise = promise;
              }
            }

            value.status = response.status;
            value.$resolved = true;

            response.resource = value;

            return response;
          }, function(response) {
            value.status = response.status;
            value.$resolved = true;

            (error||noop)(response);

            return $q.reject(response);
          });

или вы можете добавить эту строку

value.status = response.status;

а затем статус доступа в коде, например reponse.status.Только, это своего рода хак, но работал у меня. Мне также пришлось внести изменения в уменьшенную версию.