详解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 回调函数中变量作用域的讨论
Sep 11 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
Aug 27 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
jQuery判断邮箱格式对错实例代码讲解
Apr 12 jQuery
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
Aug 14 Javascript
JS实现十分钟倒计时代码实例
Oct 18 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
Vue Extends 扩展选项用法完整实例
Sep 17 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 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
10 个经典PHP函数
2013/10/17 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
javascript算法学习(直接插入排序)
2011/04/12 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
JS表单传值和URL编码转换
2018/03/03 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
对python3新增的byte类型详解
2018/12/04 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
wxPython实现文本框基础组件
2019/11/18 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
python程序需要编译吗
2020/06/19 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
大学生找工作推荐信范文
2013/11/28 职场文书
医院护士的求职信
2014/01/03 职场文书
员工考核评语大全
2014/04/26 职场文书
获奖感言范文
2015/07/31 职场文书
高中地理教学反思
2016/02/19 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
详解Python flask的前后端交互
2022/03/31 Python