详解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倒数计时按钮setTimeout的实例代码
Jul 04 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
Jul 18 Javascript
javascript移动设备Web开发中对touch事件的封装实例
Jun 05 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
jQuery获取标签文本内容和html内容的方法
Mar 27 Javascript
jQuery中使用each处理json数据
Apr 23 Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 Javascript
JS实现的多张图片轮流播放幻灯片效果
Jul 22 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
Sep 14 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
使用webpack构建应用的方法步骤
Mar 04 Javascript
原生js实现弹窗消息动画
Nov 20 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扩展介绍与开发教程
2010/08/19 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
你应该知道的python列表去重方法
2017/01/17 Python
Django验证码的生成与使用示例
2017/05/20 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python配置文件写入过程详解
2019/10/19 Python
py-charm延长试用期限实例
2019/12/22 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
Python使用xpath实现图片爬取
2020/09/16 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
社区七一党员活动方案
2014/01/25 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
详解JS数组方法
2021/11/20 Javascript