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解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
angularjs中的单元测试实例
Dec 06 Javascript
scrollWidth,clientWidth,offsetWidth的区别
Jan 13 Javascript
JavaScript内存管理介绍
Mar 13 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 Javascript
使用原生js+canvas实现模拟心电图的实例
Sep 20 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 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模板技术原理【一】
2008/01/10 PHP
php数字游戏 计算24算法
2012/06/10 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python超时重新请求解决方案
2019/10/21 Python
Python如何计算语句执行时间
2019/11/22 Python
python实现从ftp服务器下载文件
2020/03/03 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
Python中如何定义一个函数
2016/09/06 面试题
升学宴主持词
2014/04/02 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS