Как получить код статуса ответа HTTP в AngularJS 1.2
Используя ngResource
в AngularJS 1.2rc (x), как мне получить код состояния сейчас?
RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});
где RestAPI
- мой ngResource
.
Ответ имеет объект $promise
и ресурс, возвращенный с сервера, но не статус. Функция responseHeaders()
имеет только статус, если сервер вводит код состояния в объект заголовка, но не возвращает истинный код состояния. Поэтому некоторые серверы могут обслуживать его, а некоторые - нет.
Ответы
Ответ 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.Только, это своего рода хак, но работал у меня. Мне также пришлось внести изменения в уменьшенную версию.