AngularJS拦截所有$ http JSON响应
我有一个使用AngularJS构build的应用程序和一个以JSONforms提供所有请求的服务器端后端。 每个请求都包装在一个JSON容器中,该容器包含一个包含特定于请求的数据的数据variables。 其他数据用于在应用程序中保持状态和控制,检查错误和成功消息,并检查会话标志。 所有这些其他variables都与EVERY请求一起提供,并在数据variables之前被首先检查。
现在我有一个方法来检查JSON响应的内容,然后是数据本身。
$http.get('something.json').success(function(response) { var data = examineJSONResponse(response); //do the data stuff });
这工作和examineJSONResponse看看代码,如果有什么问题,那么它会抛出一个exception,并使用window.location.href重新加载页面。
有没有什么办法可以在AngularJS中自动执行这个操作,以便每次进行$ http调用,然后检查这个并只返回数据variables内容作为JSON响应?
你可以通过在Angular 1.1.4+中添加一个拦截器给$httpProvider.interceptors
拦截响应(请参阅这里的文档search拦截器)。
对于像json这样的特定内容types,即使调用成功,您也可能会拒绝更改或抛出exception。 您可以修改将传递给您的控制器代码的response.data
:
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'); });
注意:以下是1.1.4之前版本的原始答案( responseInterceptors
已被Angular 1.1.4弃用):
也许有更好的办法,但我认为你可以做一些类似于这个post的http响应拦截器( 这里描述)(对于特定的内容types,如json),你可能会拒绝更改或抛出一个exception,即使这个调用是成功的。 您可以修改将传递给您的控制器代码的response.data
。
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'); });
另一个解决scheme是创build一个服务并使用$ httpvariables。
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); ); } }]);
现在可以这样调用
myHttp(url, onSuccess, onFailure);