详解AngularJS用Interceptors来统一处理HTTP请求和响应


Posted in Javascript onJune 08, 2017

Web 开发中,除了数据操作之外,最频繁的就是发起和处理各种 HTTP 请求了,加上 HTTP 请求又是异步的,如果在每个请求中来单独捕获各种常规错误,处理各类自定义错误,那将会有大量的功能类似的代码,或者使用丑陋的方法在每个请求中调用某几个自定义的函数来处理。这两种方法基本都不是靠谱之选。好在 AngularJS 提供了 Interceptors ——拦截战斗机——来对应用内所有的 XHR 请求进行统一处理。

主要功能

Interceptors 有两个处理时机,分别是:

  1. 其它程序代码执行 HTTP 请求之后,在实际从浏览器发出请求之前,即处理请求
  2. 得到请求的响应之后,在交给其它程序代码处理之前,即处理请求的响应

所以,不难理解它可以用于如下几个方面:

  1. 全局处理错误
  2. 统一进行身份验证一类的处理
  3. 对所有发出去的请求进行预处理
  4. 对所有收到的响应进行预处理
  5. 做一些增强用户体验的操作,例如显示一个进度条

基本使用

先来看看最基本的使用:

var app = angular.module('app', []);

// 定义一个 Service ,稍等将会把它作为 Interceptors 的处理函数
app.factory('HttpInterceptor', ['$q', HttpInterceptor]);

function HttpInterceptor($q) {
 return {
  request: function(config){
   return config;
  },
  requestError: function(err){
   return $q.reject(err);
  },
  response: function(res){
   return res;
  },
  responseError: function(err){
   if(-1 === err.status) {
    // 远程服务器无响应
   } else if(500 === err.status) {
    // 处理各类自定义错误
   } else if(501 === err.status) {
    // ...
   }
   return $q.reject(err);
  }
 };
}

// 添加对应的 Interceptors
app.config(['$httpProvider', function($httpProvider){
 $httpProvider.interceptors.push(HttpInterceptor);
}]);

进一步了解

实际的 Interceptor 处理函数中, return 了一个包含四个成员的对象,这四个成员都 不是必须 的,可以按实际情况指定一二,分别如下:

  1. request :接收一个参数,它是 $http 中的标准 config 对象,同时也需要返回一个标准 config ,此时可以添加各类身份验证信息,同时也可在此启动进度条
  2. requestError :当有多个 Interceptor 的时候, requestError 会在前一个 Interceptor 抛出错误或者执行 $q.reject() 时执行,接收的参数就对应的错误
  3. response :接受一个请求对象参数,可以不处理就直接返回,此时也可以将进度条显示为成功完成,当然,如果后端 API 返回自定义错误时,HTTP 的状态码仍然是 200 得话,便在这里处理自定义错误,也可以对返回数据做一些处理,注意要将进度条置为完成
  4. responseError :这个是重头戏,即可以处理标准的 Http 错误,如服务器没有响应时,或者 PHP 之类的 CGI 经常出现的 502 一类,还可以处理 HTTP 状态码不是 200 的各类自定义错误

上面四个中,前两个是请求的前置处理,后两个是针对请求的响应的处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 Javascript
jQuery(非HTML5)可编辑表格实现代码
Dec 11 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
Sep 05 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
Nov 21 Javascript
JavaScript实现99乘法表及隔行变色实例代码
Feb 24 Javascript
纯JS代码实现气泡效果
May 04 Javascript
改变checkbox默认选中状态及取值的实现代码
May 26 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
JavaScript如何借用构造函数继承
Nov 06 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
Aug 03 Javascript
微信小程序开发之实现自定义Toast弹框
Jun 08 #Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 #Javascript
javascript实现二叉树遍历的代码
Jun 08 #Javascript
微信小程序tabbar不显示解决办法
Jun 08 #Javascript
javascript实现二叉树的代码
Jun 08 #Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 #Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 #Javascript
You might like
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
关于尾递归的使用详解
2013/05/02 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python的unittest测试类代码实例
2017/12/07 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
优秀员工推荐信
2014/05/10 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
社区党员干部承诺书
2015/05/04 职场文书
花木兰观后感
2015/06/10 职场文书
八年级语文教学反思
2016/03/03 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers