当前位置: 首页 > 编程日记 > 正文

$httpprovider指令中拦截器interceptors的使用介绍

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

$http服务允许我们使用http请求和后台做通信,但是在每一次放松请求之前我们都希望能够捕捉这个请求并且进行操作,比如之前富瑞中每一个请求中header要放入用户名和密码一样,富瑞的做法是放了一个全局变量,但是这个方法是非常不可取的!全部变量污染的问题,所以在angularjs指令中的拦截器就是个很好的解决方案!然后对于http请求的一些服务也可以有一个很好的统一的处理方法

下面具体说下$httpprovider中的interceptors,下面称之为拦截器
其实也就是$httpprovider服务包含一个拦截器数组,是一个简单的factory注册进来的。

创建拦截器:
写一个factory

angular.module('pldApp.services', []).factory('authInterceptor',function () {return {request: function (config) {config.headers = config.headers || {};var token = JSON.parse(window.localStorage.getItem("token")) || "";config.headers.Authorization = 'Bearer ' + token.access_token;return config;}};});

config里面配置

$httpProvider.interceptors.push('authInterceptor');

然后在每一次发送请求的时候都调用request方法,这里我打印了config的具体信息,其实这里大家可以看到请求的具体内容,然后我们可以在他发送请求之前大肆的改动请求的内容。225432_nGbb_2491705.png

这里我用的是request方法
拦截器允许有一下四个操作:
1、 请求的拦截:request
这个方法的调用在$http请求之前
所以在此之前我们可以修改配置和进行其他操作!
2、 拦截响应:response
当$http服务收到后台给出响应的时候,这个方法被调用。所以我们可以修改请求响应。这个方法接受一个响应对象作为参数。响应对象包含请求配置、标题、状态以及从后台返回的数据。如果返回的是一个无效的对象或者是promise,这个是不会调用的。
3、 拦截请求错误:requestError
4、 拦截响应错误:responseError
这里注意拦截响应错误!!!当你的controller这么写的时候

$scope.getLogin = function(){$scope.myLoading();loginService.getLogin($scope.user.name,$scope.user.paw).success(function(data){window.localStorage.setItem("token",JSON.stringify(data));window.localStorage.setItem("username",$scope.user.name);window.localStorage.setItem("password",$scope.user.paw);//获取用户信息loginService.getUserInfo().success(function(data){mineService.setInifo(data);}).error(function(status,error){$ionicLoading.show({template:chargeStatus(status)});});$scope.lodingHide();$scope.skipPage('tab.homePage');}).error(function(error,status){$ionicLoading.show({template:chargeStatus(status)});$timeout(function () {$ionicLoading.hide();},2000);});
};

如果登录名和密码错误了,但是你依旧这么封装responseError的话,controller会执行成功毁掉函数的225602_ICod_2491705.png

所以这里我们其实需要自己重新封装个promise的,这样才能够让controller中执行失败的回调函数。

所以上面三个我的写法是这样的

angular.module('pldApp.services', []).factory('authInterceptor',function ($q) {return {request: function (config) {config.headers = config.headers || {};var token = JSON.parse(window.localStorage.getItem("token")) || "";config.headers.Authorization = 'Bearer ' + token.access_token;return config;},response: function(response) {console.log("response:");console.log(response);return response;},responseError:function(errorReason){console.log(errorReason);return $q.reject(errorReason);},requestError:function(errorReason){console.log(2);return $q.reject(errorReason);}};});

因为这个我也接触的不是特别深入,所以这里给大家只是简单的介绍了下基本用法

下面是从网上找的一些引用:
异步操作:

module.factory('myInterceptor', ['$q', 'someAsyncService', function($q, someAsyncService) {  var requestInterceptor = {request: function(config) {var deferred = $q.defer();someAsyncService.doAsyncOperation().then(function() {// Asynchronous operation succeeded, modify config accordingly...deferred.resolve(config);}, function() {// Asynchronous operation failed, modify config accordingly...deferred.resolve(config);});return deferred.promise;}};return requestInterceptor;
}]);

Session 拦截器
现在创建一个get请求:

$http.get('https://api.github.com/users/naorye/repos');

被之前的配置对象 sessionInjector :

{"transformRequest": [null],"transformResponse": [null],"method": "GET","url": "https://api.github.com/users/naorye/repos","headers": {"Accept": "application/json, text/plain, */*"}
}

配置对象 sessionInjector :

{"transformRequest": [null],"transformResponse": [null],"method": "GET","url": "https://api.github.com/users/naorye/repos","headers": {"Accept": "application/json, text/plain, */*","x-session-token": 415954427904}
}

请求恢复拦截器:

module.factory('requestRejector', ['$q', function($q) {  var requestRejector = {request: function(config) {return $q.reject('requestRejector');}};return requestRejector;
}]);
module.factory('requestRecoverer', ['$q', function($q) {  var requestRecoverer = {requestError: function(rejectReason) {if (rejectReason === 'requestRejector') {// Recover the requestreturn {transformRequest: [],transformResponse: [],method: 'GET',url: 'https://api.github.com/users/naorye/repos',headers: {Accept: 'application/json, text/plain, */*'}};} else {return $q.reject(rejectReason);}}};return requestRecoverer;
}]);
module.config(['$httpProvider', function($httpProvider) {  $httpProvider.interceptors.push('requestRejector');// Removing 'requestRecoverer' will result to failed request$httpProvider.interceptors.push('requestRecoverer'); 
}]);

Session recover拦截器的使用

module.factory('sessionRecoverer', ['$q', '$injector', function($q, $injector) {  var sessionRecoverer = {responseError: function(response) {// Session has expiredif (response.status == 419){var SessionService = $injector.get('SessionService');var $http = $injector.get('$http');var deferred = $q.defer();// Create a new session (recover the session)// We use login method that logs the user in using the current credentials and// returns a promiseSessionService.login().then(deferred.resolve, deferred.reject);// When the session recovered, make the same backend call again and chain the requestreturn deferred.promise.then(function() {return $http(response.config);});}return $q.reject(response);}};return sessionRecoverer;
}]);
module.config(['$httpProvider', function($httpProvider) {  $httpProvider.interceptors.push('sessionRecoverer');
}]);

这里就是说道了,要重新封装promise。

这一块其实我也只是刚刚踏入了解,如果后续大家有研究,可以互相讨论讨论!
说到这,是不是发现$q很有搞头?!有必要研究下?!


转载于:https://my.oschina.net/Nealyang/blog/603692

相关文章:

bzero, memset ,setmem 区别

bzero 原型&#xff1a;extern void bzero(void *s, int n);用法&#xff1a;#include <string.h> 功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 举例&#xff1a; // bzero.c #include <sysl…

了解这4个重点,带你探索未来将如何设计智能系统和机器人!

作者 | Himanshu Ragtah 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 到目前为止&#xff0c;为智能系统设计零件需要从头开始构建零件。从2D草图到可以根据给定的成本、材料和最大重量限制制造的可行且坚固的零件。这通常需要几天…

静态路由和默认路由的配置实例

RTA的配置&#xff1a;interface FastEthernet0/0ip address 1.1.1.2 255.255.255.252duplex autospeed auto!interface FastEthernet0/1no ip addressduplex autospeed autoshutdown!interface FastEthernet1/0ip address 10.10.10.1 255.255.255.0duplex autospeed auto!inte…

Centos运行级别和开机过程

一、Linux运行级别1&#xff09;0&#xff1a;关机2&#xff09;1&#xff1a;单用户3&#xff09;2&#xff1a;多用户状态没有网络服务4&#xff09;3&#xff1a;多用户状态有网络服务5&#xff09;4&#xff1a;系统未使用保留给用户6&#xff09;5&#xff1a;图形界面7&a…

PHP FPM设置

php-fpm启动 拷贝启用文件 # cp -R ./sapi/fpm/php-fpm /etc/init.d/php-fpm 启动 # /etc/init.d/php-fpm 重启 # killall php-fpm # /etc/init.d/php-fpm ------------------------ 进程不够就会起新&#xff0c;新的不能超过pm.max_children&#xff1b; 但是新的也会变为…

MySQL的binarylog处理

繁忙中測試新到的服務器&#xff0c;調試優化app&#xff0c;再加上月底公司搬家&#xff0c;很多配置都要更改。早上不經意telnet改dns的時候發現MySQL日誌很大了。。。 奇怪&#xff0c;我設置過的都改過了。。後來發現這台是子公司帶過來的機器。。。。以前那幾台都沒寫過配…

IJCAI 2020灭霸式拒稿,AI审稿是否更公平?

来源 | 数据派 THU编辑 | 文婧出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一、IJCAI 2020灭霸式拒稿引众怒随着AAAI 2020于2月7日作为2020年人工智能学界的第一个顶会在美国纽约开幕&#xff0c;人工智能相关领域的研究者们又要为新一年的顶会忙碌了。对于AI界的…

ASP.NET MVC 中将FormCollection与实体间转换方法

http://blog.csdn.net/lutinghuan/article/details/8449296 将Action动作中传递的FormCollection转变成对应的实体&#xff0c;可以使用Controller的TryUpdateModel()方法。 示例如下&#xff1a; [csharp] view plaincopy [HttpPost] public ActionResult Create(FormCollect…

增量学习不只有finetune,三星AI提增量式少样本目标检测算法 | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记该论文研究了非常有意义的增量式少样本目标检测场景iFSD(Incremental Few-Shot Detection)&#xff0c;场景设置如下&#xff1a;检测模型可以在包含充足样本的基础类别上进行训练训练好后&#xff0c;iFSD能够应用到真实世界中&…

修改Linux内核参数提高服务器并发能力

1.参数设置 查看相关的参数 sysctl -a|grep tcp_keepalive net.ipv4.tcp_keepalive_intvl 30 net.ipv4.tcp_keepalive_probes 2 net.ipv4.tcp_keepalive_time 160 设置相关的参数 sysctl -w net.ipv4.tcp_keepalive_time 7500 也可以直接打开 # vim/etc/sysctl.conf 加入ne…

GPS小车移动应用程序

//用于desktop部署private void btnInitializeObjects_Click(object sender, System.EventArgs e){Catalog Cat MapInfo.Engine.Session.Current.Catalog; //创建临时层TableInfoMemTable tblInfoTemp new TableInfoMemTable("Animation");Table tblTemp Cat.GetT…

iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" interface ViewController ()<NSURLSessionDataDelegate> //输出流 property (nonatomic, strong) NSOutputStream *stream ; //Task对象 property …

fcntl使用

1、获取文件的flags&#xff0c;即open函数的第二个参数: flags fcntl(fd,F_GETFL,0); 2、设置文件的flags: fcntl(fd,F_SETFL,flags); 3、增加文件的某个flags&#xff0c;比如文件是阻塞的&#xff0c;想设置成非阻塞: flags fcntl(fd,F_GETFL,0)…

两次关于软考网络工程师的经历

考过两次软考网络工程师&#xff0c;第一次没怎么准备&#xff0c;稀里糊涂参加考试&#xff0c;下午差几分&#xff1b;第二次痛定思痛&#xff0c;好好的分析了下试题&#xff0c;上午61&#xff0c;下午49&#xff0c;下午只写了30分钟左右&#xff0c;因为觉得自己过的了了…

“不会数学,干啥都不行!”骨灰级程序员:你方向不对,努力也白费!

最近半年来&#xff0c;我们收到了很多留言&#xff0c;有很多都是相似的问题&#xff1a;1&#xff09;数学不好搞编程好难&#xff0c;因为数据结构、编程语句、算法&#xff0c;核心原理都是数学。而且光会基础数学远远不够&#xff0c;还需要概率论&#xff0c;微积分、优化…

重新安装nginx注意事项

记得清理/etc/nginx/sites-enabled/default转载于:https://www.cnblogs.com/xiangnan/p/5146775.html

2020年,5种将死的编程语言

来源 | 码农网 译者 | 小峰曾几何时&#xff0c;几乎每个人都在使用Perl语言编程。但是那些经常使用的人慢慢地发现&#xff0c;关于这个Perl语言似乎总是有点不对劲。至少我知道有这么个叫做“piecemeal”的编程语言&#xff0c;它的创造者似乎就只是将这个功能堆在另一个功能…

关于 ulimit -SHn 65535

使用ulimit -a 可以查看当前系统的所有限制值&#xff0c;使用ulimit -n 可以查看当前的最大打开文件数。 新装的linux默认只有1024&#xff0c;当作负载较大的服务器时&#xff0c;很容易遇到error: too many open files。因此&#xff0c;需要将其改大。 使用 ulimit -n 65…

Could not load file or assembly App_Licenses.dll的问题

今天在AspDotNetStorefront做定制化开发&#xff0c;编译的时候莫名其妙地报告Could not load file or assembly App_Licenses, Version0.0.0.0, Cultureneutral, ... (Exception from HRESULT: 0x80070057 (E_INVALIDARG))的错误&#xff0c;检查文件系统&#xff0c;发现文件…

Docker 用法总结之:管理工具 shipyard 的具体使用指南

Docker 的命令行就已经非常好用了&#xff0c;假设非要加上基于 Web 的管理界面的话也有一些选择&#xff0c;如 DockerUI (Angular.js), Dockland (Ruby), Shipyard (Python/Django) 等。只是眼下来看 Shipyard 项目要活跃一点&#xff0c;Shipyard 支持多 host&#xff0c;能…

轻量级简单队列服务HTTPSQS安装与使用

原文地址&#xff1a;http://blog.s135.com/httpsqs 1.安装 wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz tar zxvf libevent-2.0.12-stable.tar.gz cd libevent-2.0.12-stable/ ./configure --prefix/usr/local/libevent-2.0.12-stable/ make…

GitHub移动端正式发布

整理 | 郭芮图源 | 视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在去年的 Universe 大会上&#xff0c;GitHub 推出了尚处于 Beta 阶段的移动版客户端&#xff08;GitHub for mobile&#xff09;&#xff0c;支持 iOS 和 Android 两大主流移动平台。时隔…

手机的定制化需求

根据自身的市场需求&#xff0c;文化环境&#xff0c;业务定位等诸多因素&#xff0c;运营商会对手机提出定制化要求&#xff0c;并指定相应的手机规范。随着差异化竞争和精益经营的不断提高&#xff0c;由运营商提出的手机规范也越来越复杂。据不完全统计&#xff08;图10-1&a…

oracle 9i 安装及连接远程数据库

用oracle 11g很久了&#xff0c;真的感觉是一个很重量级的客户端&#xff0c;安装都要一个多小时&#xff0c;最近刚开始接触这种精简版的数据库客户端&#xff0c;捣鼓了半天&#xff0c;总算成功。 1.下载客户端 2.安装 傻瓜式安装即可&#xff0c;记得自己的路径。 3.配置环…

FAST-CGI安装与使用

FastCGI 像是一个常驻 (long-live) 型的 CGI&#xff0c;它可以一直执行着&#xff0c;只要激活后&#xff0c;不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。 1.下载安装fcgi # wget http://www.fastcgi.com/dist/fcgi.tar.gz # ta…

利用 JQuery的load函数动态加载页面

利用JQuery的load函数动态加载页面 JQuery有好多Ajax函数&#xff0c;其中load是用来动态加载一个页面的内容到指定的dom元素上。我们来做个例子&#xff1a;做一个上下&#xff08;左右&#xff09;结构的页面&#xff0c;其中下左部分放2个以前我们做过的div按钮&#xff0c…

教你用Android做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划

作者 | Pek_KuaiJia责编 | 夕颜头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着目前用户需求的精细化和智能化&#xff0c;很多时候我们需要在App内集成语音输入模块&#xff0c;为用户提供语音输入的功能。而科大讯飞语音作为行业内翘楚&#…

基于r-Kernel的LiteOS操作系统

LiteOS是应用于资源受限的传感网络的一种基于线程的类UNIX操作系统。也就是说它跑在存储空间和RAM有限的超低电压微控制器上&#xff0c;这也是吸引我关注它的原因&#xff08;在超低电压下系统更易出错&#xff09;。它採用r-kernel内核&#xff0c;r-kernel有三个特征&#x…

Linux网络编程中的几组类似功能的区别

1.bzero与memset char buff[1024]; memset(buff,0,sizeof(buff));bzero(buff, sizeof(buff)); struct sockaddr_in addr memset(&addr, 0, sizeof(addr)); bzero(buff, sizeof(buff)); 参考《UNIX网络编程 卷1&#xff1a;套接字联网API 第3版》1.2的解释&#xff1a…

5个案例让Python输出漂亮的表格!

来源 | Python数据之道前言最近在用python写一个小工具&#xff0c;这个工具主要就是用来管理各种资源的信息&#xff0c;比如阿里云的ECS等信息&#xff0c;因为我工作的电脑使用的是LINUX&#xff0c;所以就想着用 Python写一个命令行的管理工具&#xff0c;基本的功能就是同…