详解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 表单之间的数据传递代码
Dec 04 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
node.js中的events.emitter.removeListener方法使用说明
Dec 10 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
Nov 30 Javascript
js学习阶段总结(必看篇)
Jun 16 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
老生常谈javascript的类型转换
Oct 12 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
layui 数据表格复选框实现单选功能的例子
Sep 19 Javascript
vue 虚拟DOM的原理
Oct 03 Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
拖拉表格的JS函数
2008/11/20 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
微信小程序获取当前位置和城市名
2019/11/13 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
python http接口自动化脚本详解
2018/01/02 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Python中的__init__作用是什么
2020/06/09 Python
python 获取字典键值对的实现
2020/11/12 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
《画杨桃》教学反思
2014/04/13 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
个人党性分析总结
2015/03/05 职场文书
结婚通知短信大全
2015/04/17 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis