>

详解AngularJS中的http拦截

- 编辑:正版管家婆马报彩图 -

详解AngularJS中的http拦截

http拦截,即$http服务允许大家与服务端交互,一时候大家期望在发出央浼从前以及抽取响应之后做些事情。
$httpProvider包括了一个interceptors的数组。

详解AngularJS中的http拦截,详解angularjs拦截

http拦截,即$http服务允许我们与服务端交互,有的时候候大家愿目的在于发出诉求此前以及接受响应之后做些职业。
$httpProvider满含了一个interceptors的数组。

大家如此创立一个interceptor。

app.factory('myInterceptor', ['$log', function($log){
  $log.debug('');

  var myInterceptor = {};

  return myInterceptor;
}])

继之注册interceptor. 

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;
}])

■ Session拦截,须要拦截

服务端有2连串型的辨证,多少个是依赖cookie的,一种是基于token的。对于基于token验证,当顾客登陆,获取一个来自服务端的token,那一个token在每贰回呼吁时发送给服务端。

创办二个关于session的injector:

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;
}])

看得出,把从服务端重返的token放在了config.headers中。

注册injector:

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

发生二个呼吁:

$http.get('');

阻挡前大约是:

{
  "transformRequest":[null],
  "transformResponse":[null],
  "method":"GET",
  "url":"",
  "headers":{
    "Accept": "application/json, text/plain,*/*"
  }
}

掣肘后,在headers中多四个八个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');
}])

■ Session错误复苏,响应拦截

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;
}])

以上正是本文的全体内容,希望对大家的学习抱有帮忙。

我们这么创立三个interceptor。

您大概感兴趣的篇章:

  • 相比较之下剖析AngularJS中的$http.post与jQuery.post的分别
  • 浅析AngularJs HTTP响应拦截器
  • 快捷学习AngularJs HTTP响应拦截器
  • AngularJS中哪些选择$http对MongoLab数据表进行增加和删除改查
  • 详解AngularJS中$http缓存以及管理八个$http恳求的点子
  • 简要介绍AngularJS中$http服务的用法

http拦截 ,即$http服务允许大家与服务端交互,有的时候候我们目的在于在发出乞请从前以及接受响应之后...

app.factory('myInterceptor', ['$log', function($log){
  $log.debug('');

  var myInterceptor = {};

  return myInterceptor;
}])

进而注册interceptor. 

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;
}])

■ Session拦截,央浼拦截

服务端有2种等级次序的印证,二个是依靠cookie的,一种是基于token的。对于基于token验证,当客户登入,获取一个源于服务端的token,那几个token在每三回呼吁时发送给服务端。

创建二个关于session的injector:

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;
}])

可知,把从服务端重返的token放在了config.headers中。

注册injector:

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

发生一个呼吁:

$http.get('');

堵住前大约是:

{
  "transformRequest":[null],
  "transformResponse":[null],
  "method":"GET",
  "url":"",
  "headers":{
    "Accept": "application/json, text/plain,*/*"
  }
}

阻拦后,在headers中多五个多少个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');
}])

■ Session错误复苏,响应拦截

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;
}])

上述正是本文的全部内容,希望对我们的求学抱有协助。

你也许感兴趣的小说:

  • 简要介绍AngularJS中$http服务的用法
  • 相比较深入分析AngularJS中的$http.post与jQuery.post的区别
  • 详解AngularJS中$http缓存以及处理多少个$http央求的法子
  • AngularJS中$http服务常用的使用及参数
  • 后端接收不到AngularJs中$http.post发送的数量原因分析及消除办法
  • AngularJS通过$http和服务器通讯详解
  • AngularJS出现$http异步后台不能够猎取必要参数难题的消除措施
  • 浅谈angularjs $http提交数据探究
  • angularJS之$http:与服务器交互示例
  • AngularJS中$http使用的简易介绍

本文由网络计算发布,转载请注明来源:详解AngularJS中的http拦截