angular中的http拦截器Interceptors的实现


Posted in Javascript onFebruary 21, 2017

在angularJs中增加了一个对全局的http请求统一做出处理的api--interceptors

Interceptors 有两个处理时机,分别是:

  • 其它程序代码执行 HTTP 请求之后,在实际从浏览器发出请求之前,即处理请求
  • 得到请求的响应之后,在交给其它程序代码处理之前,即处理请求的响应

其引用场景包括

  • 全局处理错误
  • 统一进行身份验证一类的处理
  • 对所有发出去的请求进行预处理
  • 对所有收到的响应进行预处理等等

使用实例如下:

commonService.config(['$httpProvider',function($httpProvider){

    //$httpProvider.defaults.headers.common = {'X-Auth-Token': $.cookie('x_auth_token'),'Content-Type':'application/json;charset=UTF-8'};

    //添加拦截器;

    $httpProvider.interceptors.push(function ($q) {

      return {

        request: function (obj) {
               

          $('.loading').show();

          obj.headers['X-Auth-Token'] = $.cookie('x_auth_token');

          if(!obj.headers['Content-Type'])

            obj.headers['Content-Type'] = 'application/json;charset=UTF-8';

 

          var url, params,method;

       

          //加盟店请求

          mylog('jiamengdian::',sessionStorage.getItem("chainStorefrnId"));

          if(sessionStorage.getItem("chainStorefrnId")){

            //增加操作人id,name和storeid等信息

            //操作人姓名

            var operatorName = $.cookie("userType") == "employee" ? decodeURI($.cookie("username")) : decodeURI($.cookie("frnName"));

            //操作人id

            var operatorId = $.cookie("userId");

            //加盟店id

            var operatorStoreId = $.cookie("frnId");

            if (obj.method) {

              method = obj.method.toLowerCase();

            } else {

              method = "get";

            }

            //处理url,区分首次授信还是追加授信

            var flag_url = sessionStorage.getItem('chainStoreFlag');

            mylog('flag_url',flag_url);

            if(flag_url && flag_url == "firstcredit"){

 

              //提交需要加上加盟店标识

              if(obj.url.indexOf("firstcredit/createPerFirstCredit")!=-1){

                //标识个人提交

                obj.url = obj.url.replace('firstcredit/createPerFirstCredit','firstcredit/perFirstCreditByFranchisee');

              }

              else if(obj.url.indexOf("firstcredit/createBusiFirstCredit")!=-1){

                //标识企业提交

                obj.url = obj.url.replace('firstcredit/createBusiFirstCredit','firstcredit/createBusiFirstCreditByFranchisee');

              }

             
              } else {

                url = obj.url + "?creditType=1&operatorName=" + operatorName + "&operatorId=" + operatorId + "&operatorStoreId=" + operatorStoreId;

               }

            }

          return obj;

        },

        response: function (res) {

          $(".loading").hide();

          return res;

        },

        responseError: function (err) {

          $(".loading").hide();

          return $q.reject(err);

        }

      };

    });

  }]);

改api共有4个方法,分别为request ,requestError ,response ,responseError ,这个四个方法非必选,可根据需要调用,前两个是请求的前置处理,后两个是针对请求的响应的处理。

  • request :接收一个参数,它是 $http 中的标准 config 对象,同时也需要返回一个标准 config ,此时可以添加各类身份验证信息,同时也可在此启动进度条
  • requestError :当有多个 Interceptor 的时候, requestError 会在前一个 Interceptor 抛出错误或者执行 $q.reject() 时执行,接收的参数就对应的错误
  • response :接受一个请求对象参数,可以不处理就直接返回,此时也可以将进度条显示为成功完成,当然,如果后端 API 返回自定义错误时,HTTP 的状态码仍然是 200 得话,便在这里处理自定义错误,也可以对返回数据做一些处理,注意要将进度条置为完成
  • responseError :这个是重头戏,即可以处理标准的 Http 错误,如服务器没有响应时,或者 PHP 之类的 CGI 经常出现的 502 一类,还可以处理 HTTP 状态码不是 200 的各类自定义错误

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 字符串转换成数字的三种方法
Mar 23 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
使用JQuery在线制作ppt并在线演示源码特效
Sep 08 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
JavaScript实现简单的拖动效果
Jul 02 Javascript
Bootstrap基本插件学习笔记之按钮(21)
Dec 08 Javascript
js保留两位小数方法总结
Jan 31 Javascript
使用 vue.js 构建大型单页应用
Feb 10 Javascript
浅谈实现vue2.0响应式的基本思路
Feb 13 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
javascript实现简单页面倒计时
Mar 02 Javascript
微信小程序 PHP生成带参数二维码
Feb 21 #Javascript
vue-resource 拦截器使用详解
Feb 21 #Javascript
微信小程序 template模板详解及实例
Feb 21 #Javascript
Bootstrap 3 按钮标签实例代码
Feb 21 #Javascript
Angular实现购物车计算示例代码
Feb 21 #Javascript
原生js实现倒计时--2018
Feb 21 #Javascript
vue-router:嵌套路由的使用方法
Feb 21 #Javascript
You might like
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python和opencv实现抠图
2018/07/18 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
高考考python编程是真的吗
2020/07/20 Python
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
车间操作工岗位职责
2013/12/19 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书