详解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 相关文章推荐
jQuery UI Dialog 创建友好的弹出对话框实现代码
Apr 12 Javascript
JavaScript插件化开发教程 (二)
Jan 27 Javascript
jQuery on()方法使用技巧详解
Apr 16 Javascript
JavaScript中常见的字符串操作函数及用法汇总
May 04 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
详解Angular2响应式表单
Jun 14 Javascript
创建简单的node服务器实例(分享)
Jun 23 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
Aug 04 Javascript
微信小程序表单验证form提交错误提示效果
Jun 19 Javascript
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
详解 微信小程序开发框架(MINA)
May 17 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版自动生成文章摘要
2008/07/23 PHP
php 文本文件的读取效率
2012/02/10 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php实现的通用图片处理类
2015/03/24 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
python实现文本文件合并
2015/12/29 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python3 深浅copy对比详解
2019/08/12 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
使用python实现画AR模型时序图
2019/11/20 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
全球性的在线购物网站:Zapals
2017/03/22 全球购物
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
超市促销实习自我鉴定
2013/09/23 职场文书
西式结婚主持词
2014/03/14 职场文书