在Vue中使用axios请求拦截的实现方法


Posted in Javascript onOctober 25, 2018

一、前言

axios的基础使用就不过多的讲解啦,如何使用可以看axios文档使用说明·Axios中文说明

在这里和大家分享一下axios拦截在实际项目中的使用

很多人都看过axios的官方文档中拦截器这一栏,有的人可能会有点懵,因为文档只告诉你有这个东西,而不告诉你在什么情况下使用。很多初学者就会放弃使用axios拦截器,毕竟拦截器是可以不使用的,但是使用拦截器,会在页面中减少很多不必要的代码。

二、说在前面的

项目使用的ui框架是iview

以下友好提示均使用iview ui的message提示组件,例如this.$Message.xxx

/api/request 仅仅只是例子接口,实际开发用后台提供的接口。

code是后台状态码,我这里也只是例子,不要问我为毛我的返回码和你的怎么不一样这样的问题哈...这些都需要和后台沟通约定的。

使用的请求头是:axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';至于为什么使用这个请求头可以看看我的另外一篇文章关于axios会发送两次请求,有个OPTIONS请求的问题
因为使用的是这个请求头所以需要用qs模块,不然后台不认这个数据。

三、不使用请求拦截

如果不使用请求拦截,也是可以的,但是会多了非常多的代码,我们以登录页为例。

在Vue中使用axios请求拦截的实现方法

一个单纯,没有花里胡哨的页面,|ω・)

//双向数据绑定获取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password
this.$axios.post("/api/request", this.$qs.stringify(httpRequest)).then(data => {
 //特殊错误处理,状态为10时为登录超时
 if(data.data.code === 10){
  this.$Message.error("登录已超时,请重新登录")
  this.$router.push("/login")
 //其余错误状态处理 
 }else if(data.data.code != 0){
  this.$Message.error(data.data.msg)
 //请求成功
 }else if(data.data.code === 0){
  //进行成功业务逻辑
 }
 //.......
});

如果不使用请求拦截,那么对每一条请求每一个状态都要特殊处理,如果请求特殊状态有数十个,每个页面有很多请求,那么页面会变得很长很臃肿,不好维护。

三、使用请求拦截

相同的请求返回代码我们可以抽取出来,写在请求拦截中

当我们设置了拦截之后,在我们的组件代码中可以简化很多,还是以登录界面为例:

在main.js中

//请求发送拦截,把数据发送给后台之前做些什么......
axios.interceptors.request.use((request) => {
 //这个例子中data是loginName和password
 let REQUEST_DATA = request.data
 //统一进行qs模块转换
 request.data = qs.stringify(REQUEST_DATA)
 //再发送给后台
 return request;
}, function (error) {
 // Do something with request error
 return Promise.reject(error);
});
//请求返回拦截,把数据返回到页面之前做些什么...
axios.interceptors.response.use((response) => {
 //特殊错误处理,状态为10时为登录超时
 if (response.data.code === 10) {
 iView.Message.error("登录已超时,请重新登录");
 router.push("/login")
 //其余错误状态处理 
 } else if (response.data.code != 0) {
 iView.Message.error(response.data.msg)
 //请求成功
 } else if(response.data.code === 0){
 //将我们请求到的信息返回页面中请求的逻辑
 return response;
 }
 //......
}, function (error) {
 return Promise.reject(error);
});
//双向数据绑定获取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password
this.$axios.post("/api/request", httpRequest).then(data => {
 //这是要先判断data,如果请求的数据状态code不为0,会被拦截,则data为undefined
 if(data){
  //进行请求返回成功逻辑
 }
});

这样我们就对axios请求添加了拦截,可以减少很多代码逻辑,页面可读性更高,可维护性也更高

四、其他

这就是axios拦截的最基础的用法,当然也不止于此,我们也可以进行扩展延伸,做更多的事情,只要你的业务有需求,axios拦截总能帮到你,这些就需要举一反三,工具是死的人是活的,我可以再举个小例子,比如设置请求签名。

请求签名是前台和后台约定的一种沟通方式,对数据进行加密,可以一定程度上保证数据的安全性

还是以这个登录页面为例

//双向数据绑定获取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password
this.$axios.post("/api/request", httpRequest).then(data => {
 //这是要先判断data,如果请求的数据状态code不为0,会被拦截,则data为undefined
 if(data){
  //进行请求返回成功逻辑
 }
});

我们把httpRequest这个data信息数据发送给后台之前,进行签名,并加密数据

在main.js中,我们对发送的数据进行拦截

//请求发送拦截
axios.interceptors.request.use((request) => {
 //获取请求的数据,这里是loginName和password
 let REQUEST_DATA = request.data
 //获取请求的地址,这里是/api/request
 let REQUEST_URL = request.url
 //设置签名并进行qs转换,且赋值给request的data,签名函数另外封装
 request.data = qs.stringify(requestDataFn(REQUEST_DATA, REQUEST_URL))
 //发送请求给后台
 return request;
}, function (error) {
 // Do something with request error
 return Promise.reject(error);
});
//已封装好的签名函数
function requestDataFn(data, method) {
 let postData = {}
 //时间戳,时间戳函数不作展示,也是已封装好的
 postData.timestamp = getNowFormatDate();
 //请求用户的session以及secretKey信息,为空是未登录,登录后我把它存在localStorage中,这个存在哪里都可以,这里只作为例子。
 postData.session = localStorage.getItem('session') || '';
 postData.secretKey = localStorage.getItem('secretKey') || '';
 //请求的地址,这里是/api/request
 postData.method = method;
 //请求的数据这里是loginName和password,进行base64加密
 let base64Data = Base64.encode(JSON.stringify(data));
 //设置签名并进行md5加密
 let signature = md5.hex(postData.secretKey + base64Data + postData.method + postData.session + postData.timestamp + postData.secretKey);
 //把数据再次进行加密
 postData.data = encodeURI(base64Data);
 postData.signature = signature;
 return postData
}

这样我们就完成了对数据加密以及签名,这样再发送给后台。

注意:这里只作为例子展示,如果需要用到签名,如何签名,是前台和后台沟通的结果!

axios请求拦截的用处远远不止这样,具体如何使用,还需要在实际工作,实际项目中随机应变啦。

总结

以上所述是小编给大家介绍的在Vue中使用axios请求拦截的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
Javascript Function对象扩展之延时执行函数
Jul 06 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
Jan 09 Javascript
jQuery实用基础超详细介绍
Apr 11 Javascript
jQuery中:input选择器用法实例
Jan 03 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
Jan 22 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
webpack4+react多页面架构的实现
Oct 25 #Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 #Javascript
代码整洁之道(重构)
Oct 25 #Javascript
Vue使用NPM方式搭建项目
Oct 25 #Javascript
小程序云开发实战小结
Oct 25 #Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
Oct 25 #Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 #Javascript
You might like
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
vue-ajax小封装实例
2017/09/18 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
致100米运动员广播稿
2014/02/14 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
银行求职自荐信范文
2015/03/04 职场文书
红与黑读书笔记
2015/06/29 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript