详解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 实现的全选和反选
Apr 15 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
jQuery之自动完成组件的深入解析
Jun 19 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
Aug 08 Javascript
vue devtools的安装与使用教程
Aug 08 Javascript
vue+axios实现文件下载及vue中使用axios的实例
Sep 21 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
Node.js API详解之 console模块用法详解
May 12 Javascript
jQuery实现简单三级联动效果
Sep 05 jQuery
微信小程序开发之实现自定义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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
中职生自荐信
2013/10/13 职场文书
高中数学教师求职信
2013/10/30 职场文书
活动总结报告格式
2014/05/09 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
opencv检测动态物体的实现
2021/07/21 Python