详解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 相关文章推荐
js中的hasOwnProperty和isPrototypeOf方法使用实例
Jun 06 Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
JS实现前端页面的搜索功能
Jun 12 Javascript
微信小程序中button去除默认的边框实例代码
Aug 01 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
JavaScript图片旋转效果实现方法详解
Jun 28 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 Javascript
原生js+canvas实现验证码
Nov 29 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
php框架知识点的整理和补充
2021/03/01 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
js实现数字滚动特效
2019/12/16 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python os.access()用法实例
2019/02/18 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
德国购买健身器材:AsVIVA
2017/08/09 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
大学生毕业自我评价范文分享
2013/11/11 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript