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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
JavaScript修改css样式style
Apr 15 Javascript
基于jquery的Repeater实现代码
Jul 17 Javascript
js下通过prototype扩展实现indexOf的代码
Dec 08 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
js实现图片懒加载效果
Jul 17 Javascript
详解Vue-axios 设置请求头问题
Dec 06 Javascript
koa router 多文件引入的方法示例
May 22 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
浅谈javascript错误处理
Aug 11 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
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
Python图像处理之简单画板实现方法示例
2018/08/30 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python使用python-docx读写word文档
2019/08/26 Python
python deque模块简单使用代码实例
2020/03/12 Python
python下载的库包存放路径
2020/07/27 Python
python的flask框架难学吗
2020/07/31 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
银行介绍信范文
2014/01/10 职场文书
大学生就业意向书范文
2014/04/01 职场文书
公司寄语大全
2014/04/10 职场文书
大学三年计划书范文
2014/04/30 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书