详解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 相关文章推荐
List Installed Software Features
Jun 11 Javascript
来自chinaz的ajax获取评论代码
May 03 Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
简述jQuery Easyui一些用法
Aug 01 jQuery
JavaScript时间戳与时间日期间相互转换
Dec 11 Javascript
在Vue中使用Compass的方法
Mar 02 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
Sep 16 Javascript
JavaScript中reduce()的用法
May 11 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
简单的页面缓冲技术
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
php 分页函数multi() discuz
2009/06/21 PHP
PHP 实用代码收集
2010/01/22 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP递归创建多级目录
2015/11/05 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python实现识别手写数字大纲
2018/01/29 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
教师演讲稿大全
2014/05/16 职场文书
公司合作意向书范文
2014/07/30 职场文书
个人先进材料范文
2014/12/30 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书