在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 相关文章推荐
Javascript下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
jQuery 数据缓存模块进化史详细介绍
Nov 19 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
May 11 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
使用Bootstrap美化按钮实例代码(demo)
Feb 03 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
微信小程序支付前端源码
Aug 29 Javascript
详解Vue项目中实现锚点定位
Apr 24 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
Aug 13 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
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-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
python机器学习实战之K均值聚类
2017/12/20 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
机电专业大学生求职信
2013/10/04 职场文书
销售实习自我鉴定
2013/12/07 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
《称象》教学反思
2014/04/25 职场文书
竞聘自述材料
2014/08/25 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP