json - AngularJS 拦截所有 $http JSON 响应

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

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

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

这可行,examineJSONResponse 会查看代码,如果有问题,它会抛出异常并使用 window.location.href 重新加载页面。

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

最佳答案

您可以通过使用 Angular 1.1.4+ 向 $httpProvider.interceptors 添加拦截器来拦截响应(请参阅文档 here 搜索拦截器)。

对于像 json 这样的特定内容类型,即使调用成功,您也可能会拒绝更改或抛出异常。您也可以在此处修改将传递给您的 Controller 代码的 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 中已弃用):

也许有更好的方法,但我认为您可以执行类似于 this post 的操作使用 http 响应拦截器(描述为 here)(对于特定的内容类型,如 json),即使调用成功,您也可能拒绝更改或抛出异常。您也可以在此处修改将传递给您的 Controller 代码的 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');
});

https://stackoverflow.com/questions/11956827/

相关文章:

jquery - 缺少 CORS header 'Access-Control-Allow-Ori

java - jackson - 将 java 列表写入 json 数组的最佳方法

javascript - bigint : 12000000000002539 is convert

javascript - 用单引号将字符串解析为 JSON?

c++ - 用于 C++ 的最快 JSON 读取器/写入器

ajax - 在 Chrome 中使用本地文件的 jQuery getJSON 问题

javascript - toJSON() 和 JSON.Stringify() 之间的区别

java - Spring REST多个@RequestBody参数,可能吗?

python - 在 Django 模板中按键访问字典

java - 在 Java 中合并(Concat)多个 JSONObject