详解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 相关文章推荐
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
Javascript setInterval的两种调用方法(实例讲解)
Nov 29 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
Node.js中的缓冲与流模块详细介绍
Feb 11 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
AngularJS的ng-click传参的方法
Jun 19 Javascript
Vue之Watcher源码解析(2)
Jul 19 Javascript
AngularJS 中的数据源的循环输出
Oct 12 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
Jun 20 jQuery
浅析vue-router中params和query的区别
Dec 24 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
改变Apache端口等配置修改方法
2008/06/05 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
php pdo操作数据库示例
2017/03/10 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
如何更优雅地写python代码
2019/07/02 Python
python操作yaml说明
2020/04/08 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
视图的作用
2014/12/19 面试题
应聘编辑职位自荐信范文
2014/01/05 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
2015年植树节活动总结
2015/02/06 职场文书
行政主管岗位职责范本
2015/04/09 职场文书