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 - 如何引入js代码
Mar 09 Javascript
JavaScript 变量命名规则
Sep 23 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
Oct 25 Javascript
form表单action提交的js部分与html部分
Jan 07 Javascript
jQuery功能函数详解
Feb 01 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
May 03 Javascript
AngularJS入门之动画
Jul 27 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 Javascript
一些可能会用到的Node.js面试题
Jun 15 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 10 Javascript
Vue自定义表单内容检查rules实例
Oct 30 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
Python实现的一个简单LRU cache
2014/09/26 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python计算两个地址之间的距离方法
2018/06/09 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python切图九宫格的实现方法
2019/10/10 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
本科毕业生的求职信范文
2013/11/20 职场文书
教育孩子心得体会
2014/01/01 职场文书
大学生饮食配送创业计划书
2014/01/04 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
请假条应该怎么写?
2019/06/24 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
前端JavaScript大管家 package.json
2021/11/02 Javascript