AngularJS中的http拦截
$http服务允许我们与服务端交互,有时候我们希望在发出请求之前以及收到响应之后做些事情。即http拦截。
$httpProvider包含了一个interceptors的数组。
我们这样创建一个interceptor。
app.factory('myInterceptor', ['$log', function($log){
$log.debug('');
var myInterceptor = {};
return myInterceptor;
}])
接着注册interceptor.
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('myInterceptor');
}])
以下是$http拦截的一些例子。
■ 拦截器中的异步操作
app.factory('myInterceotpr','someAsyncServcie', function($q, someAsyncServcie){
var requestInterceptor = {
request: function(config){
var deferred = %q.defer();
someAsyncService.doAsyncOperation().then(function(){
...
deferred.resolve(config);
}, function(){
...
deferred.resolve(config);
})
return deferred.promise;
}
};
return requestInterceptor;
})
以上,是一个请求拦截,做了一个异步操作,根据异步操作的结果来更新config。
当然也有响应拦截。
app.factory('myInterceptor',['$q', 'someAsyncService', function($q, someAsyncSercice){
var responseInterceptor = {
response: function(response){
var deferred = $q.defer();
someAsyncService.doAsyncOperation().then(function(response){
...
deferred.resolve(response);
}, function(response){
...
deferred.resolve(response);
})
return deferred.promise;
}
};
return responseInterceptor;
}])
■ Session拦截,请求拦截
服务端有2种类型的验证,一个是基于cookie的,一种是基于token的。对于基于token验证,当用户登录,获取一个来自服务端的token,这个token在每一次请求时发送给服务端。
创建一个有关session的injector:
app.factory('sessionInjector',['SessionService', function(SessionService){
var sessionInjector = {
request: function(config){
if(!SessionService.isAnonymous){
config.headers['x-session-token'] = SessionService.token;
}
return config;
}
};
return sessionInjector;
}])
可见,把从服务端返回的token放在了config.headers中。
注册injector:
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('sessionInjector');
}])
发出一个请求:
$http.get('');
拦截前大致是:
{
"transformRequest":[null],
"transformResponse":[null],
"method":"GET",
"url":"",
"headers":{
"Accept": "application/json, text/plain,*/*"
}
}
拦截后,在headers中多两个一个x-session-token字段:
{
"transformRequest":[null],
"transformResponse":[null],
"method":"GET",
"url":"",
"headers":{
"Accept": "application/json, text/plain,*/*",
"x-session-token":......
}
}
■ 时间戳,请求和响应拦截
app.factory('timestampMarker',[function(){
var timestampMarker = {
request:function(config){
config.requestTimestamp = new Date().getTime();
return config;
},
response: function(response){
response.config.responseTimestamp = new Date().getTime();
return config;
}
};
return timestampMarker;
}])
以上,在请求和响应时拦截,在config.requestTimestamp和config.responseTimestamp赋上当前的时间。
注册拦截器:
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('timestampMarker');
}])
然后在运用的时候可以算出请求响应所耗去的时间。
$http.get('').then(function(response){
var time = response.config.responseTime - response.config.requestTimestamp;
console.log('请求耗去的时间为 ' + time);
})
■ 请求错误恢复,请求拦截
模拟一个请求拦截的错误情形:
app.factory('requestRejector',['$q', function($q){
var requestRejector = {
request: function(config){
return $q.reject('requestRejector');
}
};
return requestRejector;
}])
拦截请求错误:
app.factory('requestRecoverer',['$q', function($q){
var requestRecoverer = {
requestError: function(rejectReason){
if(rejectReason === 'requestRejector'){
//恢复请求
return {
transformRequest:[],
transformResponse:[],
method:'GET',
url:'',
headers:{
Accept:'application/json, text/plain, */*'
}
};
} else {
return $q.reject(rejectReason);
}
}
};
return requestRecoverer;
}])
注册拦截器:
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('requestRejector');
$httpProvider.interceptors.push('requestRecoverer');
}])
■ Session错误恢复,响应拦截
app.factory('sessionRecoverer',['$q','$injector',function($q, $injector){
var sessionRecoverer = {
responseError: function(response){
//如果Session过期
if(response.status == 419){
var SessionService = $injector.get('SessionService');
var $http = $injector.get('$http');
var deferred = $q.defer();
//创建一个新的session
SessionService.login().then(deferred.resolve, deferred.reject);
return deferred.promise.then(function(){
reutrn $http(response.config);
})
}
return $q.reject(response);
}
};
return sessionRecoverer;
}])
参考资料:http://www.webdeveasy.com/
AngularJS中的http拦截的更多相关文章
- Angularjs中的拦截器 (卧槽,好牛逼)
$httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...
- 在AngularJs中怎么设置请求头信息(headers)及不同方法的比较
在AngularJS中有三种方式可以设置请求头信息: 1.在http服务的在服务端发送请求时,也就是调用http()方法时,在config对象中设置请求头信息:事例如下: $http.post('/s ...
- AngularJS中的身份验证
欢迎大家指导与讨论 : ) 一. 身份验证的意义 首先呢,网络应用的身份验证的意图在于:保护网站中的重要资源.基于某些原因这些资源并不能公开,比如付费资源(交过钱的用户才能上的网络课程),或者一 ...
- AngularJS 中利用 Interceptors 来统一处理 HTTP 的错误(reproduce)
原文:http://chensd.com/2016-03/Angular-Handle-Global-Http-Error-with-Interceptors.html?utm_source=tuic ...
- angularJS中XHR与promise
angularJS应用是完全运行在客户端的应用,我们可以通过angularJS构建一个不需依赖于后端,同时能够实现动态内容和响应的web应用,angularJS提供了将应用与远程服务器的信息集成在一起 ...
- angular中的http拦截器Interceptors
在angularJs中增加了一个对全局的http请求统一做出处理的api--interceptors Interceptors 有两个处理时机,分别是: 其它程序代码执行 HTTP 请求之后,在实际从 ...
- AngularJS中get请求URL出现跨域问题
今天早上帮助同学看了一个AngularJS的问题,主要是请求中出现了跨域访问,请求被阻止. 下面是她给我的代码: <html lang="en" ng-app="m ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- AngularJS中的表单验证
AngularJS中的表单验证 AngularJS自带了很多验证,什么必填,最大长度,最小长度...,这里记录几个有用的正则式验证 1.使用angularjs的表单验证 正则式验证 只需要配置一个正则 ...
随机推荐
- Spring 4 官方文档学习(十一)Web MVC 框架之HTTP caching support
一个良好的HTTP缓存策略可以显著地增进web应用的性能和其客户端的体验.主要使用"Cache-Control" HTTP response header来完成,配合conditi ...
- zabbix监控超详细搭建过程
监控及zabbix 目录: 1 监控分类... 1 1.1 硬件监控... 1 1.2 系统监控... 2 1.3 网络监控... 3 1.4 ...
- com.apache.dc.query.Query所属包名apache-common-sid.jar
com.apache.dc.query.Query所属包名apache-common-sid.jar 首先这个类是基于HQL的,好多方法里面要传String clzz, 刚开始我真不知道这个参数传什么 ...
- MapReduce: 一种简化的大规模集群数据处理法
(只有文字没有图,图请参考http://research.google.com/archive/mapreduce.html) MapReduce: 一种简化的大规模集群数据处理法 翻译:风里来雨里去 ...
- css3之转换
1.2D转换 2.3D转换 transform-style属性(设置三维/二维效果) 值: flat表示子元素不保留3D设置(默认) preserve-3d表示子元素保留3D设置 transform属 ...
- Unity5 如何做资源管理和增量更新
工具 Unity 中的资源来源有三个途径:一个是Unity自动打包资源,一个是Resources,一个是AssetBundle. Unity自动打包资源是指在Unity场景中直接使用到的资源会随着场景 ...
- heartbeat安装与配置
Hearbeat和keepalived区别 Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP): He ...
- Cocos与Cocos2d-x协作教程——多分辨率适配
http://www.cocoachina.com/bbs/read.php?tid-288123.html Cocos v2.1开始新增了一种新的多分辨率适配方案:流式布局. 这种布局相比Cocos ...
- Virtualbox修改bios信息安装Windows XP OEM
转载 http://hi.baidu.com/guoyao11/item/631ad6eb4fb3d93887d9de11 具体方法有两个: 1.把下面的代码复制改后缀为BAT文件直接运行即可,以Le ...
- halcon学习笔记——(11)Image,region,xld初步
一 读取的3种方式: 读取单张的图片: read_image( image,'filename') //image 是输出对象,后面是输入文件的路径和名称 读取多图: 1,申明一个数组,分别保存路径 ...