全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解为Angular.js内置$http服务添加拦截器的方法

前言

在Angular框架中,创建团队为使用者进行了Ajax请求的封装,并通过$http服务暴露出相关的接口.Angular在其官方文档中指出, $http服务底层针对Web常见的安全攻击做出了相应的对策,也就是说使用$http服务封装的Ajax为使用者提供了更为安全的保障.作为一个框架,保证框架的可用性,适配性是很有必要的. Angular在设计,实现中也体现出来了这样的良好风格.我们通常在使用Ajax时,有时候希望我们能够在请求发起前或接收到请求后做一些相应的处理工作,比如:在请求发起前,在请求头中添加一下报文段.在请求返回时对一请求处理状态做一些管理,如统一处理404状态等等.Angular的$http服务在设计实现时充分考虑到了上述的情况.接下来,我们一起来学习和了解一下如何为$http服务添加拦截器,以及如何在我们自己实现的服务中实现类似的拦截器机制.

什么是拦截器–What are Interceptors?

Interceptor(拦截器)在服务端框架中属于一种比较常见的机制,如spring,Struts2等Java框架中拦截器属于基本配置项.拦截器提供了一种机制可以使开发者可以定义在一个action(动作)执行的前后执行的代码,这些代码可以是在一个action执行前阻止其执行的代码,也可以是修改目标动作某些行为的代码.(在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。在Spring框架中比较常见)

$http服务中的拦截器

查看API或是源码我们可以发现,Angular的实现中通过 httpProvider提供了一个名为interceptors的数组.这个数组接受拦截器服务注册,通过过程次的注册最终会形成拦截器链.这样每次在调用http服务的时候,angular都会通过我们定义的拦截点(切面)进行相应的Ajax动作修改.理论就不多说了,下面开始进入实战:

Angular中如何声明一个拦截器

// Interceptor declaration
module.factory('httpInterceptor', ['$log', function($log) {
  $log.debug('$log is here to show you that this is a regular factory with injection');

  return { 
      // do something
      };
}]);

如何将声明的拦截器注册到$http服务中

// Add the interceptor to $httpProvider.interceptors
module.config(['$httpProvider', function($httpProvider) { 
  $httpProvider.interceptors.push('httpInterceptor');
}]);

通过上面的简单两个步骤,我们基本就完成了http服务的拦截器编写与添加.但是上面的代码片段并不能实际使用,要想真正的实现拦截操作,我们还需要遵循http服务暴露出来的可以进行拦截的点进行相关的代码编写.

$httpProvider暴露了那些可以拦截的点?

  1. request : request方法可以实现拦截请求: 该方法会在 http发送请求到服务器之前执行,因此我们可以在该方法的视线中修改配置或做其他的操作。该方法接收请求配置对象(requestconfigurationobject)作为参数,然后必须返回配置对象或者promise。如果返回无效的配置对象或者promise则会被拒绝,导致http 调用失败。
  2. response : response方法可以实现拦截响应: 该方法会在 http接收到从服务器过来的响应之后执行,因此我们可以修改响应报文或做其他操作。该方法接收响应对象(responseobject)作为参数,然后必须返回响应对象或者promise。响应对象包括了请求配置(requestconfiguration),头(headers),状态(status)和从后台过来的数据(data)。如果返回无效的响应对象或者promise会被拒绝,导致http 调用失败。
  3. requestError : requestError方法可以实现拦截请求异常: 有时候一个请求发送失败或者被拦截器拒绝了。请求异常拦截器会俘获那些被上一个请求拦截器中断的请求。它可以用来恢复请求或者有时可以用来撤销请求之前所做的配置,比如说关闭进度条,激活按钮和输入框什么之类的。
  4. responseError : responseError方法可以实现拦截响应异常: 有时候我们后台调用失败了。也有可能它被一个请求拦截器拒绝了,或者被上一个响应拦截器中断了。在这种情况下,响应异常拦截器可以帮助我们恢复后台调用。

对于上面暴露出来的接口使用也是异常的简单的,我们可以像声明一个简单的服务一样声明一个$http服务的拦截器,并交由angular的注入机制去使用我们配置的拦截器.

// 如同声明一个Angular服务一样声明一个拦截器
module.factory('sessionInjector', ['authService', function (authService){
  return {
    request: function (config){
      if (!authService.isAnonymus) {
        config.headers['x-session-token'] = authService.token;
      }
      return config;
    }
  };
}]);

// 然后将我们声明的拦截器添加到$httpProvider的拦截器链中,之后的服务注入Angular会负责帮我们完善
module.config(['$httpProvider', function ($httpProvider){
  $httpProvider.interceptors.push('sessionInjector');
}]);

$http服务拦截器的异步支持

部分场景下,我们希望在拦截器中能够执行一些异步操作.然后依据不同的处理结果进行不同的拦截操作,AngularJS在设计的时候也很好的支持了这一特性.AngularJS允许我们在拦截的方法中,我们可以返回一个promise对象.如在http服务中,我们如果返回一个promise对象时,http服务将会延迟发起网络请求或是延迟响应请求结果.

module.factory('myInterceptor', ['$q', 'someAsyncService', function($q, someAsyncService) {
  var requestInterceptor = {
    request: function(config) {
      var deferred = $q.defer();
      someAsyncService.doAsyncOperation().then(function() {
        // Asynchronous operation succeeded, modify config accordingly
        ...
        deferred.resolve(config);
      }, function() {
        // Asynchronous operation failed, modify config accordingly
        ...
        deferred.resolve(config);
      });
      return deferred.promise;
    },
    response: function(response) {
          var deferred = $q.defer();
          someAsyncService.doAsyncOperation().then(function() {
            // Asynchronous operation succeeded, modify response accordingly
            ...
            deferred.resolve(response);
          }, function() {
            // Asynchronous operation failed, modify response accordingly
            ...
            deferred.resolve(response);
          });
          return deferred.promise;
        }
  };

  return requestInterceptor;
}]);

上面的例子中,在请求发起时,如果对应的deferred被拒绝,http请求则会失败(如果进行抓包分析的话,你会发现http请求并没有发起).在请求进行响应时,如果deferred被拒绝,则请求也会失败.(抓包分析,网络请求是有返回的).

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# angularjs  # 拦截器  # http拦截器  # angular2  # 浅析AngularJs HTTP响应拦截器  # 快速学习AngularJs HTTP响应拦截器  # 详解Angular.js中$http拦截器的介绍及使用  # 我们可以  # 可以实现  # 被拒  # 会在  # 则会  # 这一  # 是在  # 也有  # 很好  # 也会  # 出了  # 是有  # 将会  # 说了  # 拒绝了  # 不多  # 很有  # 其他的  # 可用性 


相关文章: 如何在IIS中新建站点并配置端口与物理路径?  小型网站建站如何选择虚拟主机?  如何彻底删除建站之星生成的Banner?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  建站之星安装后界面空白如何解决?  如何获取PHP WAP自助建站系统源码?  如何高效利用亚马逊云主机搭建企业网站?  如何通过商城自助建站源码实现零基础高效建站?  建站之星代理费用多少?最新价格详情介绍  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  网站制作需要会哪些技术,建立一个网站要花费多少?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何在景安云服务器上绑定域名并配置虚拟主机?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在景安服务器上快速搭建个人网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何通过宝塔面板实现本地网站访问?  如何快速重置建站主机并恢复默认配置?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何快速完成中国万网建站详细流程?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何通过VPS建站无需域名直接访问?  网站制作企业,网站的banner和导航栏是指什么?  建站之星如何快速生成多端适配网站?  广东企业建站网站优化与SEO营销核心策略指南  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  免费视频制作网站,更新又快又好的免费电影网站?  企业微网站怎么做,公司网站和公众号有什么区别?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  教学论文网站制作软件有哪些,写论文用什么软件 ?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  非常酷的网站设计制作软件,酷培ai教育官方网站?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何配置WinSCP新建站点的密钥验证步骤?  无锡营销型网站制作公司,无锡网选车牌流程?  宝塔面板创建网站无法访问?如何快速排查修复?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  怀化网站制作公司,怀化新生儿上户网上办理流程?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何通过NAT技术实现内网高效建站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何高效生成建站之星成品网站源码?  c# await 一个已经完成的Task会发生什么  图册素材网站设计制作软件,图册的导出方式有几种?  如何访问已购建站主机并解决登录问题?  建站之星代理平台如何选择最佳方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。