2017-05-17 10 views
0
角度

で入れ子になった$のHTTPリクエストを送信します。このサービスには、1つのパブリック関数 "send"が含まれており、要求のデータを取得していくつかのチェックを行います。 1トークンがあるかどうかを確認します:ゲストトークンを取得する要求を送信しない場合は、 2トークンがある場合:期限が切れているかどうかを確認します。必要なリクエストを送信していない場合はチェックします。 3-期限切れの場合:リフレッシュトークン要求を送信し、必要な要求を送信します。

私のサービスコード:

return apiRequestSender.send(data); 

その後、使用:

(function() { 
    function service($http, tokenManager, apiService, API_URL, REFRESH_TOKEN_URL, appToken) { 
    var s = {}; 
    var defaultToken = appToken; 


    s.send = function(data) { 
     var token = tokenManager.getToken(); 
     if (token && token.length > 0) { 
     // check if expired 
     var isTokenExpired = tokenManager.isTokenExpired(); 
     if (isTokenExpired) { 
      sendRefreshTokenRequest(token).then(function(response) { 
      // update the exist token and send with the new one 
      return sendTheRequiredRequest(data, token); 
      }, function(errors) { 

      }); 
      // token is expired so we need to send refresh token then send our request 
     } else { 
      // send our request 
      return sendTheRequiredRequest(data, token); 
     } 
     } else { 
     token = defaultToken; 
     // if the request not login or count send getToken for guest first 
     if (data.loginAuthentication || data.countryCitiesAreasList) { 
      //send the request with the defaultToken 
      return sendTheRequiredRequest(data, defaultToken); 
     } else { 
      // send guest token first then the request 
      sendRequestGetTokenForGuest(defaultToken).then(function(response) { 
      var newToken = response.data.token; 
      var isSetted = tokenManager.setToken(newToken); 
      return sendTheRequiredRequest(data, newToken); 
      }, function(errors) { 

      }); 
     } 
     } 
    }; 


    function sendRequestGetTokenForGuest(token) { 
     var data = apiService.getApiObj("gtoken", "11651"); 
     var headerParams = createHeaderParams(token); 
     return $http({ 
     method: "POST", 
     url: API_URL, 
     headers: headerParams, 
     data: data 
     }); 
    } 

    function sendRefreshTokenRequest(token) { 
     var headerParams = createHeaderParams(token); 
     return $http({ 
     method: "POST", 
     url: REFRESH_TOKEN_URL, 
     headers: headerParams 
     }); 
    } 

    function sendTheRequiredRequest(data, token) { 
     var headerParams = createHeaderParams(token); 
     return $http({ 
     method: "POST", 
     url: API_URL, 
     headers: headerParams, 
     data: data 
     }); 
    } 

    function createCurrentTimeStamp() { 
     return Math.floor(Date.now()).toString(); 
    } 

    function createHeaderParams(token) { 
     var headerParams = { 
     token: token, 
     clientTimeStamp: createCurrentTimeStamp() 
     }; 
     return headerParams; 
    } 

    return s; 
    } 
    angular.module('app').factory('apiRequestSender', service); 
})(); 

は、私が「送信」とそれにデータを渡すと、これを返す関数を呼び出すことによって、各コントローラの各サービスで、このサービスを使用しますこのようなルーティングのこのサービス:

{ 
     name: 'home', 
     url: '/index', 
     templateUrl: 'home/views/index.html', 
     controller: 'homeController', 
     controllerAs: 'vm', 
     resolve: { 
     apiResponse: function(homeApiService) { 
      return homeApiService.getCitiesAreas(); 
     } 
     } 
    } 

ここで状態doe私の間違いが何であるか、それぞれの要求の前にこれらのチェックをどのように実装するのかを考えないでください。

答えて

0

ここでは$httpインターセプタを使用すると便利だと思います。 See Docs

基本的に、これにより、各 リクエストの前に機能チェックが実行されるようになります。ここでのポイントは、request関数がconfigオブジェクトを受け取ったことです。次に を変更して&をチェックしてください。configオブジェクトとこれを返すことを確認するだけです。configオブジェクト。あなたのInterceptorの内側にいくつかの$httpリクエストを行う必要がありますので が

を(直接または約束の中に戻ります)、あなたはそれが無限ループに陥っていないということ を確認する必要があります。したがって、ここでのポイントは、あなたが のURLをチェックすることです。インターセプタそのものでは、リクエストがそのようなURLと共に来ると、 だけがConfigオブジェクトを返します。

は、私はあなたのコードをあなたのためにこれがテストされていませんし、あなたに行う方法のアイデアを与える必要があることを

注意をサンプル出荷を行って

myInterceptor.js

angular 
    .module('app') 
    .factory('myInterceptor', myInterceptor); 


myInterceptor.$inject = [ 
    '$http', 
    'tokenManager', 
    'apiService', 
    'REFRESH_TOKEN_URL', 
    'GUEST_TOKEN_URL' 
]; 

function myInterceptor($http, tokenManager, apiService, REFRESH_TOKEN_URL, GUEST_TOKEN_URL) { 
    return { 
    request: request 
    }; 

    function request(config) { 
    if (config.url === REFRESH_TOKEN_URL || config.url === GUEST_TOKEN_URL) { 
     // Make sure to avoid an Infinite Loop (http calls within the Interceptor) 
     return config; 
    } 

    var defaultToken = appToken; 
    var token = tokenManager.getToken(); 
    if (token && token.length > 0) { 

     var isTokenExpired = tokenManager.isTokenExpired(); 
     if (isTokenExpired) { 

     // Set the Header Params and return the Config object. 
     return sendRefreshTokenRequest(token).then(function(response) { 
      config.headers = createHeaderParams(token); 
      return config; 
     }); 

     } else { 

     config.headers = createHeaderParams(token); 
     return config; 
     } 
    } else { 
     token = defaultToken; 

     if (data.loginAuthentication || data.countryCitiesAreasList) { 
     config.headers = createHeaderParams(defaultToken); 
     return config; 
     } else { 
     // Set the Header Params and return the Config object. 
     return sendRequestGetTokenForGuest(defaultToken).then(function(response) { 
      var newToken = response.data.token; 
      var isSetted = tokenManager.setToken(newToken); 
      config.headers = createHeaderParams(newToken); 
      return config; 
     }); 
     } 
    } 
    } 

    function createCurrentTimeStamp() { 
    return Math.floor(Date.now()).toString(); 
    } 

    function createHeaderParams(token) { 
    var headerParams = { 
     token: token, 
     clientTimeStamp: createCurrentTimeStamp() 
    }; 
    return headerParams; 
    } 

    function sendRequestGetTokenForGuest(token) { 
    var data = apiService.getApiObj("gtoken", "11651"); 
    var headerParams = createHeaderParams(token); 
    return $http({ 
     method: "POST", 
     // url: API_URL, 
     // Changed because you want to capture this URL in the Interceptor, 
     // so it wont do its checks when the url is like this. (avoid Infinite loop) 
     url: GUEST_TOKEN_URL, 
     headers: headerParams, 
     data: data 
    }); 
    } 

    function sendRefreshTokenRequest(token) { 
    var headerParams = createHeaderParams(token); 
    return $http({ 
     method: "POST", 
     url: REFRESH_TOKEN_URL, 
     headers: headerParams 
    }); 
    } 
} 

インターセプタを登録してください:

angular 
    .module('app') 
    .config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('myInterceptor'); 
}]); 

希望すると便利です:)

関連する問題

 関連する問題