如何在错误拦截器中再次发送ngRessource请求?

时间:2016-09-07 19:56:39

标签: javascript angularjs ionic-framework angularjs-scope

我需要在自定义oauth2 API上进行身份验证。所以我使用角度模块angular-oauth2。身份验证有效。如果请求失败导致AccessToken不再有效,我需要使用refreshToken刷新accessToken。刷新工作,但在那之后我必须再次发送失败的请求。希望有人知道如何再次发送该请求。

.controller('StartCtrl', function($scope, $sampleapi) {
  $scope.load = function(){
    $sampleapi.account.getData({}, function(result){
        $scope.data = result;
    });
  };
  $scope.$on("$ionicView.enter", $scope.load());
});

这是触发请求的控制器。

.factory('$sampleapi', function($resource, baseUrl){
  return {
    account: $resource(baseUrl, {}, {
      getData: {
        method: 'GET',
        url: baseUrl + '/endpoint',
        cache: false,
        timeout: 30000
      }
    })
  }
})

提出所有请求的工厂。

$rootScope.$on('oauth:error', function(event, rejection){
  if(rejection.data.error === 'invalid_grant' && rejection.data.error_description === 'Invalid username and password combination') {
    //login failed
  }
  else if(rejection.data.error === 'invalid_grant' && rejection.data.error_description === 'The access token provided has expired.') {
    //request new accessToken with refreshToken
    OAuth.getRefreshToken().then(function(){
      //accessToken refreshed -> send failed request again HOW??
    }); 
  }
  else if(rejection.data.error === 'invalid_grant' && rejection.data.error_description === 'Refresh token has expired'){
    //refreshToken not valid anymore -> logout
  }
  else {
    //some other error
  }
});

捕获任何失败请求的错误拦截器。

重复请求的响应应该在StartCtrl范围内提供。

1 个答案:

答案 0 :(得分:0)

来自文档:

  

拦截

     

出于全局错误处理,身份验证或任何类型的请求或响应后处理的同步或异步预处理的目的,希望能够在请求被传递到之前拦截请求服务器和响应在移交给发起这些请求的应用程序代码之前。

     

拦截器是通过将$httpProvider阵列添加到$httpProvider.interceptors来注册的服务工厂。调用工厂并注入依赖项(如果指定)并返回拦截器。

- AngularJS $http Service API Reference -- interceptors