详解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 相关文章推荐
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
js 剪切板应用clipboardData详细解析
Dec 17 Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
关于Jquery中的事件绑定总结
Oct 26 Javascript
jsTree使用记录实例
Dec 01 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 jQuery
vue使用v-for实现hover点击效果
Sep 29 Javascript
JavaScript作用域链实例详解
Jan 21 Javascript
通过实例了解js函数中参数的传递
Jun 15 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
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Python列表的切片实例讲解
2019/08/20 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
物流合作计划书
2014/01/10 职场文书
小学语文教学反思
2014/02/10 职场文书
秘书英文求职信
2014/04/16 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
会计求职信怎么写
2015/03/20 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电