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 相关文章推荐
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
解析jquery获取父窗口的元素
Jun 26 Javascript
JS 实现点击a标签的时候让其背景更换
Oct 15 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
详解javascript获取url信息的常见方法
Dec 19 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
Feb 04 Javascript
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 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
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
python绘图库Matplotlib的安装
2014/07/03 Python
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
基于Python闭包及其作用域详解
2017/08/28 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
Django celery异步任务实现代码示例
2020/11/26 Python
Python的信号库Blinker用法详解
2020/12/31 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
五型班组建设方案
2014/02/10 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
演讲开场白和结束语
2015/05/29 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电