详解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 相关文章推荐
使用按钮控制以何种方式打开新窗口的属性介绍
Dec 17 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
javascript实用方法总结
Feb 06 Javascript
jQuery关键词说明插件cluetip使用指南
Apr 21 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
详解AngularJs ui-router 路由的简单介绍
Apr 26 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
Nov 20 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
html实现随机点名器的示例代码
Apr 02 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
ajax缓存问题解决途径
2006/12/06 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
js实现返回顶部效果
2017/03/10 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
python在windows下实现备份程序实例
2014/07/04 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
Python os.access()用法实例
2019/02/18 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
师德演讲稿范文
2014/05/06 职场文书
素质教育标语
2014/06/27 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
mysql 子查询的使用
2022/04/28 MySQL