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 相关文章推荐
网络图片延迟加载实现代码 超越jquery控件
Mar 27 Javascript
JQuery调用WebServices的方法和4个实例
May 06 Javascript
javascript学习笔记(四)function函数部分
Sep 30 Javascript
javascript正则表达式基础知识入门
Apr 20 Javascript
jQuery原生的动画效果
Jul 10 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
Oct 21 Javascript
JS实现Fisheye效果动感放大菜单代码
Oct 21 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
JavaScript中的函数式编程详解
Aug 22 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 结果集的分页实现代码
2009/03/10 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
PHP中overload与override的区别
2017/02/13 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
YII框架http缓存操作示例
2019/04/29 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
js 内存释放问题
2010/04/25 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python字典DICT类型合并详解
2017/08/17 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
房屋出售授权委托书
2014/10/12 职场文书
给医院的感谢信
2015/01/21 职场文书
白鹤梁导游词
2015/02/06 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电