详解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在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
jquery数组之存放checkbox全选值示例代码
Dec 20 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
JS获取子窗口中返回的数据实现方法
May 28 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
bootstrap select下拉搜索插件使用方法详解
Nov 23 Javascript
微信小程序使用request网络请求操作实例
Dec 15 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
Apr 01 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 Javascript
vue-router的hooks用法详解
Jun 08 Javascript
原生js 实现表单验证功能
Feb 08 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 session 预定义数组
2009/03/16 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
php创建图像具体步骤
2017/03/13 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
vue.js删除列表中的一行
2018/06/30 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
node+multer实现图片上传的示例代码
2020/02/18 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
matplotlib中legend位置调整解析
2017/12/19 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
详解pandas映射与数据转换
2021/01/22 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
小学教师自我鉴定
2013/11/07 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书