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 相关文章推荐
javascript indexOf函数使用说明
Jul 03 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 Javascript
jquery 利用show和hidden实现级联菜单示例代码
Aug 09 Javascript
仿百度输入框智能提示的js代码
Aug 22 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
javascript函数定义的几种区别小结
Jan 06 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
Jan 04 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
JavaScript数组排序功能简单实现
May 14 Javascript
vue-quill-editor的使用及个性化定制操作
Aug 04 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使用qr生成二维码的示例分享
2014/01/20 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
Stop SQL Server
2007/06/21 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
js实现简单点赞操作
2020/03/17 Javascript
Python open读写文件实现脚本
2008/09/06 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
python仿抖音表白神器
2019/04/08 Python
Django中的用户身份验证示例详解
2019/08/07 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python 检测图片是否有马赛克
2020/12/01 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
工作自我评价范文
2015/03/05 职场文书
综合素质评价自我评价
2015/03/06 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
职位证明模板
2015/06/23 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
python中pymysql包操作数据库方法
2022/04/19 Python