拦截器不会被触发

时间:2016-05-26 08:15:33

标签: angularjs httprequest interceptor angular-resource

我正在尝试为我的应用实施全局授权处理。

在这里,您可以看到我的代码:

.factory('Request', ['$resource', 'general',
        function ($resource) {
            return $resource(baseURL + ':resourceName/', {}, {
                get : {
                    method : 'GET',
                    isArray : true,
                    transformResponse : function (data, headers) {
                        return JSON.parse(data).data;
                    },
                    interceptor: {
                        request : function (data) {
                            console.log("test");
                        },
                        requestError : function (data) {
                            console.log("test");
                        },
                        response : function (data) {
                            console.log("test");
                        },
                        responseError : function (data) {
                            console.log("test");
                            if(data.state == 401){
                                general.logIn({},false,function(){});
                            }
                        }

                    }
                }
            });
        }
    ]);

但是,没有触发任何拦截器。代码有什么问题?

3 个答案:

答案 0 :(得分:2)

根据Angular文档,在$ resource中使用的拦截器只有两个有效的拦截器对象方法:

  

interceptor - {Object =} - 拦截器对象有两个可选项   方法 - 响应和响应错误。响应和responseError都有   使用http响应对象调用拦截器。见$ http   拦截器。

请参阅:https://docs.angularjs.org/api/ngResource/service/ $ resource

如果您还需要请求方法,则必须遵循此处的文档:https://docs.angularjs.org/api/ng/service/ $ http

另外,我注意到你已经定义了两次responseError,而不是response和responseError:

responseError : function (data) {
    console.log("test");
},
responseError : function (data) {
    console.log("test");
    if(data.state == 401){
        general.logIn({},false,function(){});
    }
}

答案 1 :(得分:1)

取自关于$ resource的Angular文档:

  

interceptor - {Object =} - 拦截器对象有两个可选方法 - response和responseError。使用http响应对象调用响应和responseError拦截器。请参阅$ http拦截器。

如果您想使用所有四个拦截器,我建议您使用httpProvider配置您的应用。您可以将所有4种可能性推送到interceptors阵列。

这样的事情:

m.config(["$httpProvider", ($httpProvider: ng.IHttpProvider) => {
            $httpProvider.interceptors.push(["$q" , (q: ng.IQService) => {

                    return {
                        'request': (config) => {
                            ..Handle request...

                            return config;
                        },

                        'requestError': (rejection) => {
                            ..Handle requestError...

                            return $q.reject(rejection);
                        },

                        'response': (response) => {
                            ..Handle response...

                            return response;
                        },

                        'responseError': (rejection) => {
                            ..Handle responseError...

                            return $q.reject(rejection);
                        }
                    }
                }
            ]);
       }]);

答案 2 :(得分:0)

您错过了将“常规”插入服务功能,所以

 responseError : function (data) {
                        console.log("test");
                        if(data.state == 401){
                            general.logIn({},false,function(){});
                        }
                    }

根本不起作用