详解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 相关文章推荐
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
浅析node.js中close事件
Nov 26 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
Dec 15 Javascript
jQuery+CSS3实现点赞功能
Mar 13 Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
在vue中封装可复用的组件方法
Mar 01 Javascript
vuex实现及简略解析(小结)
Mar 01 Javascript
使用vuex解决刷新页面state数据消失的问题记录
May 08 Javascript
微信小程序实现原生步骤条
Jul 25 Javascript
React中Ref 的使用方法详解
Apr 28 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
建站常用13种PHP开源CMS比较
2009/08/23 PHP
php 学习资料零碎东西
2010/12/04 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php简单实现快速排序的方法
2015/04/04 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python线程的两种编程方式
2015/04/14 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
python opencv实现图像配准与比较
2021/02/09 Python
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
学历公证书范本
2014/04/09 职场文书
公司活动总结怎么写
2014/06/25 职场文书
教师党员承诺书2015
2015/01/21 职场文书
车间主任岗位职责
2015/02/03 职场文书
亮剑观后感
2015/06/05 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android