在Restangular中删除或覆盖范围配置的请求拦截器

时间:2015-10-15 12:48:55

标签: javascript angularjs restangular

我使用Restangular在单页Angular Web应用程序中处理我的令牌/标头身份验证。 使用addFullRequestInterceptor,我使用个人密钥加密数据,为每个传出的REST API调用设置正确的标头。

Restangular
        .setBaseUrl(CONSTANTS.API_URL)
        .setRequestSuffix('.json')
        .setDefaultHeaders({'X-MyApp-ApiKey': CONSTANTS.API_KEY})
        .addFullRequestInterceptor(requestInterceptor)
        .addErrorInterceptor(errorInterceptor);

function requestInterceptor(element, operation, route, url, headers, params, httpConfig) {
        var timeStamp = Helpers.generateTimestamp(),
            //Condensed code for illustration purposes
            authSign = Helpers.generateAuthenticationHash(hashIngredients, key, token),
            allHeaders = angular.extend(headers, {
                'X-MyApp-Timestamp': timeStamp,
                'Authentication': authSign
            });

        return {
            headers: allHeaders
        }
    }

效果很好。但是我需要一个例外:对于尚未登录的新访问者,通过REST请求通用密钥/令牌对。此密钥/令牌对用于登录身份验证调用的标头中。 因此,对于此调用,我创建了一个单独的Restangular子配置。在这个配置中,我想覆盖requestInterceptor。但这似乎被忽略了(即仍然调用原始拦截器)。如果我传递null或返回空对象的函数,则无关紧要。

var specialRestInst = Restangular.withConfig(function(RestangularConfigurer) {
                RestangularConfigurer.addFullRequestInterceptor(function() {return {}});
            }),
            timeStamp = Helpers.generateTimestamp(),
            header = {'X-MyApp-Timestamp': timeStamp};

        specialRestInst.one('initialise').get({id: 'app'}, header)

正如Restangular所记录的那样,withConfig采用基本配置并对其进行扩展。我想知道如何removeFullRequestInterceptor(这个函数不存在),覆盖它或类似的东西。

1 个答案:

答案 0 :(得分:0)

我会采用不同的方法并尝试将标志传递给拦截器。如果该标志存在,则排除authSign。您可以使用withHttpConfig执行此操作。最好排除特殊情况,然后总是要告诉拦截器包含authSign

所以你会像这样更新拦截器。

function requestInterceptor(element, operation, route, url, headers, params, httpConfig) {
    var timeStamp = Helpers.generateTimestamp();
    var allHeaders = {'X-MyApp-Timestamp': timeStamp};
    if(!httpConfig.excludeAuth) {
        //Condensed code for illustration purposes
        var authSign = Helpers.generateAuthenticationHash(hashIngredients, key, token);
        allHeaders['Authentication'] = authSign;
    }
    return angular.extend(headers, allHeaders);
}

当你需要排除authSign时,你会像这样使用restangular。

specialRestInst.withHttpConfig({excludeAuth: true}).get({id: 'app'});

您应该可以将任何值添加到您想要的http配置中,只要它们尚未使用过。

我不确定这是否会按预期工作,但我无法理解为什么它无法正常工作。