with - AngularJS intercepta todas las respuestas $ http JSON
http delete (2)
Tengo una aplicación creada usando AngularJS y un servidor backend que entrega todas las solicitudes en forma JSON. Todas y cada una de las solicitudes se envuelven en un contenedor JSON que contiene una variable de datos que contiene los datos específicos de la solicitud. Los demás datos, que se utilizan para mantener el estado y el control dentro de la aplicación, verifican los errores y los mensajes de éxito, y verifican los indicadores de sesión. Todas estas otras variables se sirven con CADA solicitud y se examinan primero antes de que la variable de datos sea.
En este momento tengo un método para examinar el contenido de la respuesta JSON primero y luego los datos en sí.
$http.get(''something.json'').success(function(response) {
var data = examineJSONResponse(response);
//do the data stuff
});
Esto funciona y el examineJSONResponse echa un vistazo al código y si hay algo mal, arroja una excepción y vuelve a cargar la página usando window.location.href.
¿Hay alguna manera de que pueda automatizar esto dentro de AngularJS para que cada vez que se realiza una llamada de $ http, compruebe esto y SÓLO devuelva los contenidos de la variable de datos como la respuesta JSON?
Otra solución es crear un servicio y usarlo alrededor de la variable $ http.
angular.module(''App'', [])
.factory(''myHttp'',[''$http'',function($http) {
return function(url, success, failure) {
$http.get(url).success(function(json) {
var data = examineJSONResponse(json);
data && data.success ? success() : failure();
}).error(failure);
);
}
}]);
Y ahora esto se puede llamar así:
myHttp(url, onSuccess, onFailure);
Puede interceptar las respuestas agregando un interceptor a $httpProvider.interceptors
con Angular 1.1.4+ (consulte la documentación aquí para buscar interceptores).
Para un tipo de contenido específico como json, puede rechazar cambios o lanzar una excepción incluso si la llamada fue un éxito. Puede modificar la response.data
que se transferirá a su código de controlador también aquí:
myModule.factory(''myHttpInterceptor'', function ($q) {
return {
response: function (response) {
// do something on success
if(response.headers()[''content-type''] === "application/json; charset=utf-8"){
// Validate response, if not ok reject
var data = examineJSONResponse(response); // assumes this function is available
if(!data)
return $q.reject(response);
}
return response;
},
responseError: function (response) {
// do something on error
return $q.reject(response);
}
};
});
myModule.config(function ($httpProvider) {
$httpProvider.interceptors.push(''myHttpInterceptor'');
});
NOTA: Aquí está la respuesta original para las versiones anteriores a la 1.1.4 ( responseInterceptors
fueron obsoletos con Angular 1.1.4):
Tal vez hay una forma mejor, pero creo que puedes hacer algo similar a esta publicación con el interceptor de respuesta http (descrito aquí ) (para un tipo de contenido específico como json) donde potencialmente rechazas cambios o lanzas una excepción aunque la llamada fue un éxito . Puedes modificar los datos de response.data
que se pasarán a tu código de controlador también aquí.
myModule.factory(''myHttpInterceptor'', function ($q) {
return function (promise) {
return promise.then(function (response) {
// do something on success
if(response.headers()[''content-type''] === "application/json; charset=utf-8"){
// Validate response if not ok reject
var data = examineJSONResponse(response); // assumes this function is available
if(!data)
return $q.reject(response);
}
return response;
}, function (response) {
// do something on error
return $q.reject(response);
});
};
});
myModule.config(function ($httpProvider) {
$httpProvider.responseInterceptors.push(''myHttpInterceptor'');
});