http 가로채기, 즉 $http 서비스를 통해 서버와 상호 작용할 수 있습니다. 때로는 요청하기 전과 응답을 받은 후에 무언가를 하고 싶을 때가 있습니다.
$httpProvider에는 인터셉터 배열이 포함되어 있습니다.
이런 인터셉터를 만듭니다.
app.factory('myInterceptor', ['$log', function($log){ $log.debug(''); var myInterceptor = {}; return myInterceptor; }])
그런 다음 인터셉터를 등록합니다
app.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push('myInterceptor'); }])
다음은 $http 가로채기의 몇 가지 예입니다.
■ 인터셉터의 비동기 작업
app.factory('myInterceotpr','someAsyncServcie', function($q, someAsyncServcie){ var requestInterceptor = { request: function(config){ var deferred = %q.defer(); someAsyncService.doAsyncOperation().then(function(){ ... deferred.resolve(config); }, function(){ ... deferred.resolve(config); }) return deferred.promise; } }; return requestInterceptor; })
위는 요청을 가로채서 비동기 작업을 수행하고, 비동기 작업 결과에 따라 config가 업데이트되는 것입니다.
물론 응답 차단도 있습니다.
app.factory('myInterceptor',['$q', 'someAsyncService', function($q, someAsyncSercice){ var responseInterceptor = { response: function(response){ var deferred = $q.defer(); someAsyncService.doAsyncOperation().then(function(response){ ... deferred.resolve(response); }, function(response){ ... deferred.resolve(response); }) return deferred.promise; } }; return responseInterceptor; }])
■ 세션 차단, 요청 차단
서버에는 두 가지 유형의 인증이 있는데, 하나는 쿠키 기반이고 다른 하나는 토큰 기반입니다. 토큰 기반 인증의 경우 사용자가 로그인하면 서버에서 토큰을 얻고 이 토큰은 각 요청과 함께 서버로 전송됩니다.
세션과 관련된 인젝터 만들기:
app.factory('sessionInjector',['SessionService', function(SessionService){ var sessionInjector = { request: function(config){ if(!SessionService.isAnonymous){ config.headers['x-session-token'] = SessionService.token; } return config; } }; return sessionInjector; }])
서버에서 반환된 토큰이 config.headers에 들어있는 것을 볼 수 있습니다.
인젝터 등록:
app.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push('sessionInjector'); }])
요청하기:
$http.get('');
차단 전 대략적인 내용은 다음과 같습니다.
{ "transformRequest":[null], "transformResponse":[null], "method":"GET", "url":"", "headers":{ "Accept": "application/json, text/plain,*/*" } }
차단 후 헤더에 두 개의 x-session-token 필드를 더 추가합니다.
{ "transformRequest":[null], "transformResponse":[null], "method":"GET", "url":"", "headers":{ "Accept": "application/json, text/plain,*/*", "x-session-token":...... } }
■ 타임스탬프, 요청 및 응답 차단
app.factory('timestampMarker',[function(){ var timestampMarker = { request:function(config){ config.requestTimestamp = new Date().getTime(); return config; }, response: function(response){ response.config.responseTimestamp = new Date().getTime(); return config; } }; return timestampMarker; }])
위에서는 요청과 응답 중에 가로채고, config.requestTimestamp와 config.responseTimestamp에 현재 시간을 할당합니다.
인터셉터 등록:
app.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push('timestampMarker'); }])
그런 다음 이를 사용할 때 요청이 응답하는 데 걸리는 시간을 계산할 수 있습니다.
$http.get('').then(function(response){ var time = response.config.responseTime - response.config.requestTimestamp; console.log('请求耗去的时间为 ' + time); })
■ 오류 복구 요청, 차단 요청
요청 차단 오류 상황 시뮬레이션:
app.factory('requestRejector',['$q', function($q){ var requestRejector = { request: function(config){ return $q.reject('requestRejector'); } }; return requestRejector; }])
차단 요청 오류:
app.factory('requestRecoverer',['$q', function($q){ var requestRecoverer = { requestError: function(rejectReason){ if(rejectReason === 'requestRejector'){ //恢复请求 return { transformRequest:[], transformResponse:[], method:'GET', url:'', headers:{ Accept:'application/json, text/plain, */*' } }; } else { return $q.reject(rejectReason); } } }; return requestRecoverer; }])
인터셉터 등록:
app.config(['$httpProvider', function($httpProvider){ $httpProvider.interceptors.push('requestRejector'); $httpProvider.interceptors.push('requestRecoverer'); }])
■ 세션 오류 복구, 응답 차단
app.factory('sessionRecoverer',['$q','$injector',function($q, $injector){ var sessionRecoverer = { responseError: function(response){ //如果Session过期 if(response.status == 419){ var SessionService = $injector.get('SessionService'); var $http = $injector.get('$http'); var deferred = $q.defer(); //创建一个新的session SessionService.login().then(deferred.resolve, deferred.reject); return deferred.promise.then(function(){ reutrn $http(response.config); }) } return $q.reject(response); } }; return sessionRecoverer; }])
위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.