javascript - para - http/1.1 200 ok
Los códigos de estado de error no están siendo capturados (3)
Estoy tratando de capturar el código de estado de error de HTTP de angular resource (! = 200). Mi servicio, donde tengo recursos definidos: (apiService.js)
.factory(''ApiService'', function($resource, $http, localStorageService, CONFIG) {
var base_api_url = api_url = CONFIG.api_url, api_version_prefix = CONFIG.api_version_prefix;
return {
userDevices: $resource(api_url+''/requestRegistration/userDevices/:action'', {}, {
registerDevice: {
method: ''POST'',
params: {
action: ''''
}
},
verify: {
method: ''POST'',
params: {
action: ''verify''
}
},
}
}
});
El código de mi controlador:
.controller(''LoginCtrl'', function(CONFIG, $scope, $state, $ionicPlatform, $ionicPopup, ApiService) {
$scope.data = {
username: null
};
$scope.registerDevice = function() {
if($scope.data.username) {
var authenticationResponse = ApiService.userDevices.registerDevice({
username: $scope.data.username
});
authenticationResponse.$promise.then(function(result) {
// this is always fired, even then response code is 400 or 503 :( I am not able to check response status code.
console.log(result);
console.log(''success!'');
}, function(error){
// this code is not being exectued even when response status code is different then 200
// its never executed at all :(
console.log(''error!'');
});
}
};
});
Cuando envío la solicitud y recibo el código de respuesta 400/503, creo que el código de función (error) debe ejecutarse pero no es así.
En cambio, mi código en $promise.then(function(result)(...)
se ejecuta y no puedo detectar un código de estado HTTP de respuesta.
Entonces, mis preguntas:
- ¿Por qué no se está ejecutando mi función de manejo de errores?
- ¿Cómo puedo detectar códigos de estado de respuesta HTTP?
El primer .catch
está convirtiendo los rechazos en cumplidos. Para evitar la conversión, el método .catch
debe throw
el error.
authenticationResponse.$promise.catch(function(error){
alert(''catched error!!!'');
//throw to chain error
throw error;
}).then(function(result) {
// this is always fired, even then response code is 400 or 503 :(
console.log(result);
console.log(''success!'');
//return to chain data
return result
}, function(error){
// This should be executed when status code is different then 200?
// its never executed at all :(
console.log(''error!'');
//throw to chain rejection
throw error;
});
Cuando una función omite una declaración return
o throw
, devuelve undefined
. El servicio $q
crea una promesa derivada que se resuelve como undefined
.
Diagnosticar problemas de ngResource
Para diagnosticar problemas con $resource
métodos $resource
, agregue un interceptor de respuesta:
userDevices: $resource(api_url+''/requestRegistration/userDevices/:action'', {}, {
registerDevice: {
method: ''POST'',
params: {
action: ''''
},
interceptor: {
response: function (response) {
console.log("registerDevice success");
console.log(response.status);
return response;
},
errorResponse: function (errorResponse) {
console.log("registerDevice error");
console.log(errorResponse.status);
throw errorResponse;
}
}
},
verify: {
method: ''POST'',
El otro aspecto a tener en cuenta es que hay otros interceptores $ http en la aplicación que convierte las respuestas al omitir una instrucción throw .
Puedes usar un interceptor.
Interceptar las solicitudes antes de que se entreguen al servidor y las respuestas antes de que se entreguen al código de la aplicación que inició estas solicitudes.
Por lo tanto, esto detectará todos los errores de respuesta que se originen en $ http con $ recurso.
$httpProvider.interceptors.push(function($q) {
return {
''responseError'': function(response) {
if (response.status == 400) {
// Handle 400 error code
}
if (response.status == 503) {
// Handle 503 error code
}
// Rejects the derived promise.
return $q.reject(response);
}
};
});
Hay una función para capturar la respuesta del estado HTTP en Angular. Puede ver cómo se hace aquí la respuesta HTTP de desbordamiento de pila