小编典典

AngularJS拦截所有$ http JSON响应

angularjs

我有一个使用AngularJS和服务器端后端构建的应用程序,该后端以JSON形式传递所有请求。每个请求都包装在一个JSON容器中,该容器包含一个数据变量,该变量包含特定于该请求的数据。其他数据用于保持应用程序内的状态和控制,检查错误和成功消息以及检查会话标志。所有其他变量都随EVERY请求一起提供,并且在数据变量之前先进行检查。

现在,我有一种方法可以先检查JSON响应的内容,然后再检查数据本身。

$http.get('something.json').success(function(response) {
   var data = examineJSONResponse(response);
   //do the data stuff
});

这可以正常工作,并且inspectJSONResponse会看一下代码,如果出了什么问题,它将抛出异常并使用window.location.href重新加载页面。

有什么方法可以在AngularJS中自动执行此操作,以便每次进行$ http调用时,它都会对此进行检查并仅将数据变量内容作为JSON响应返回?


阅读 344

收藏
2020-07-04

共1个答案

小编典典

您可以通过$httpProvider.interceptors在Angular1.1.4+中添加拦截器来拦截响应(请参阅此处的文档以搜索拦截器)。

对于像json这样的特定内容类型,即使调用成功,您也可能拒绝更改或引发异常。您还可以在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之前版本(responseInterceptorsAngular 1.1.4不推荐使用)的原始答案:

也许有更好的方法,但我认为您可以使用http响应拦截器(在此介绍)(针对json等特定内容类型)执行类似于此帖子的操作,即使调用成功,您也可能拒绝更改或引发异常。您也可以在此处修改将传递到您的控制器代码的。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');
});
2020-07-04