$ http error handling en AngularJS

$ http en mi proyecto AngularJS no puede reconocer errores 40X (401,403,405 …) en iOS. Estoy usando la versión 1.2.10 AngularJS y Cordova versión 3.4.0.

A continuación se muestra el código que estoy usando:

TE_SERVICES.factory('hello',function ($http,$rootScope) { return { loginUser: function(userCnetworkingentials,successCallback,errorCallback){ $http({ method: "GET", url: "data/example.json", headers: {"Authorization":'Basic '+userCnetworkingentials}, }).then(function(response){ successCallback(response.data); console.log("Success------"+JSON.stringify(response)) },function(data, status, headers, config){ errorCallback(data); console.log("Error------"+JSON.stringify(data)+" "+status) }) } } }); hello.loginUser($rootScope.encodedUserCnetworkingencials,function(persons) { // success handler }, function(data) { // error handler console.log(data.status+"===="+status) }); 

data.status regresa 0 y el estado vuelve indefinido. Por favor, ayúdame a resolver este problema.

Intenté include el dominio en la list blanca en IOS. Pero ninguna solución 🙁 Aún da la misma respuesta.

Pero el mismo código funciona absolutamente bien en Android. Por favor, ayúdame a resolver este problema.

Gracias por adelantado 🙂

Entonces usas el $http de angular. ¿Utiliza el error callback o la segunda function en la callback?

Ejemplo

 $http.get("someUrl") .success(function(response){}) // if http code == 200 .error(function(response){}) // else 

O con then , eso puede tomar 2 funciones. La primera es la function onSuccess, la segunda la function onError.

 $http.get("someUrl") .then(function(response){ // if http code == 200 }, function(response){ // else }); 

El parámetro de response también contiene los códigos de error.

Considere usar un $httpInterceptor para manejar todos los $httpInterceptor de $httpInterceptor en el mismo lugar, en lugar de manejarlos en cada callback de http.

ACTUALIZACIÓN : Parece que el documento angular está incompleto / equivocado para el éxito de callback. No pasa el parámetro 4 allí. Pasa un object de response que contiene toda la información sobre request + response y los datos pasados.

Actualización a la edición :

No escribes las devoluciones por ti mismo. Use promises angulares:

 TE_SERVICES.factory('hello',function ($http,$rootScope) { return { loginUser: function(userCnetworkingentials){ return $http({ method: "GET", url: "data/example.json", headers: {"Authorization":'Basic '+userCnetworkingentials}, }).then(function(response){ return response.data; },function(response){ return response; }); } } }); hello.loginUser($rootScope.encodedUserCnetworkingencials) .then(function(persons) { // success handler }, function(data) { // error handler console.log(data); }); 

Intente esto y dígame si el console.log registra algo.

Tuve exactamente el mismo problema. La aplicación de Cordova, js angulares, iPhone y 401 requestes no se reciben en el interceptor js http angular. Funcionan bien en dispositivos Android.

Mi conclusión fue que el browser IPhone está manejando a los que están en una palanca superior e intentando usar la información de authentication WWW para hacer la authentication. Es por eso que la respuesta no llega a angular.

La única solución que encontré fue cambiar mi service para devolver 400 en lugar de 401 en caso de una request de API. En este caso, devuelvo 400 con un post de error que manejo en el lado del cliente.

Espero que esto ayude.