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 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
JavaScript 小型打飞机游戏实现原理说明
Oct 28 Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
小程序实现多选框功能
Oct 30 Javascript
jQuery动态操作表单示例【基于table表格】
Dec 06 jQuery
Bootstrap4 gulp 配置详解
Jan 06 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输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
webpack4简单入门实例
2018/09/06 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
C#面试常见问题
2013/02/25 面试题
管理部部长岗位职责
2013/12/05 职场文书
应用化学专业职业生涯规划书
2013/12/31 职场文书
小学毕业家长寄语
2014/01/19 职场文书
房产公证委托书范本
2014/09/20 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
测量员岗位职责
2015/02/14 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
身份证丢失证明
2015/06/19 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL