详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
•基于Promise的HTTP请求客户端,可同时在浏览器和Node.js中使用
•vue2.0之后,就不再对vue-resource更新,而是推荐使用axios,本项目也是使用axios
•功能特性
•在浏览器中发送XMLHttpRequests请求
•在node.js中发送http请求
•支持PromiseAPI
•拦截请求和响应
•转换请求和响应数据
•取消请求
•自动转换JSON数据
•客户端支持保护安全免受CSRF/XSRF(跨站请求伪造)攻击
封装使用
建议拆分三个文件
•src
->service
---->axios.js(axios配置,拦截器、统一url)
---->index.js(接口方法,里面调用api方法,供页面级调用)
---->api
------->index.js(api方法,里面调用后端提供的接口,供接口方法调用)
axios.js基本配置
'usestrict'; importaxiosfrom'axios'; //自动识别接口使用开发环境地址(开发环境地址做了proxyTable代理,故设置为空)或线上地址 axios.defaults.baseURL=process.env.NODE_ENV==='production'?process.env.API_ROOT:''; //开发环境直接打包测试 //axios.defaults.baseURL=''; axios.interceptors.request.use(config=>{ returnconfig; },error=>{ console.log(error); returnPromise.reject(error); }); axios.interceptors.response.use(res=>{ constapiRes=res.data; returnapiRes; },asyncerror=>{ console.dir(error); returnPromise.reject(error); }); exportdefaultaxios; api/index.js调用后端提供的接口 importAxfrom'@/service/axios'; importqsfrom'qs'; exportdefault{ fetchBlog(reqData){ returnAx.get('/krryblog/blog/getBlog',{params:reqData}); }, addBlog(reqData){ returnAx.post('/krryblog/blog/addBlog',qs.stringify(reqData)); }, updateBlog(reqData){ returnAx.post('/krryblog/blog/updateBlog',qs.stringify(reqData)); }, deleteBlogCover(id,reqData){ returnAx.post(`/krryblog/blog/deleteBlogCover/${id}`,qs.stringify(reqData)); }, };
index.js接口方法(调用api)
importApifrom'./api'; exportasyncfunctiongetBlog(reqData){ letres=awaitApi.fetchBlog(reqData); returnres; }, exportasyncfunctionaddBlog(reqData){ letres=awaitApi.addBlog(reqData); returnres; }, exportasyncfunctionupdateBlog(reqData){ letres=awaitApi.updateBlog(reqData); returnres; }, exportasyncfunctiondeleteBlogCover(id,reqData){ letres=awaitApi.deleteBlogCover(id,reqData); returnres; },
页面调用
接下来就可以愉快地在页面调用了
import{getBlog}from'@/service' exportdefault{ data(){ return{ tableData:[], pageIndex:1, pageSize:9 } }, created(){ this.getList(); }, methods:{ asyncgetList(){ let{result}=awaitgetBlog({ pageIndex:this.pageIndex, pageSize:this.pageSize }); this.tableData=result.data; }, }
axios执行多个并发请求
asyncgetList(){ letresArr=[] for(letvalofthis.arrId){ //push请求 resArr.push(queryPropertyValue({id:val})) } this.tableData=[] Promise.all(resArr).then(res=>{ for(letvalofres){ letvals=val.result.propertyValues //每个请求的结果push到tableData vals.forEach(item=>this.tableData.push(item)) } }) },
或者直接在axios写promiseall
//根据id获取某一条商品数据 letgetDetail=(id)=>{ returnaxios.get(`/detail?bid=${id}`); } //检测登录的用户是否将此商品加入购物车 letdetectCar=(shopId,userId)=>{ returnaxios.get(`/detectCar?shopId=${shopId}&userId=${userId}`); } //获取一条商品数据、并且检测是否加入购物车 letgetDeAll=(shopId,userId)=>{ axios.all([ getDetail(shopId), detectCar(shopId,userId) ]).then(axios.spread((resDetail,resCar)=>{ //两个请求现已完成 //打印两个请求的响应值 console.log(resDetail); console.log(resCar); })); }
•实例的方法
axios#request(config) axios#get(url[,config]) axios#delete(url[,config]) axios#head(url[,config]) axios#post(url[,data[,config]]) axios#put(url[,data[,config]]) axios#patch(url[,data[,config]])
•请求配置:只有url是必需的,如果未指定方法,请求将默认为GET
axios拦截特定请求
业务上经常出现这个问题,需要拦截某些特定请求,在该特定请求,页面采取或不采取什么变化
研究axios的request统一拦截方法:axios.interceptors.request.use(function(config){})
参数config如下:
可以发现config.url就是请求的接口的地址,那么“/”最后的getClassify就是该请求的方法,就可以通过取出该字符串来判断某些特定请求,从而做出怎样的变化
axios.interceptors.request.use(config=>{ //判断请求是否是getClassify,如果是getClassify,不加载LoadingBar leturl=config.url; if(url.split('/').pop()==='getClassify'){ flag=false; }else{ iView.LoadingBar.start(); flag=true; } returnconfig; },error=>{ console.log(error); returnPromise.reject(error); });
如何判断所有请求加载完毕
letreqNum=0 axios.interceptors.request.use(function(config){ //在请求发出之前进行一些操作,每次发出请求就reqNum++ reqNum++ _bus.$emit('showloading') returnconfig } axios.interceptors.response.use(response=>{ //接受请求后reqNum--,判断请求所有请求是否完成 reqNum-- if(reqNum<=0){ _bus.$emit('closeLoading') }else{ _bus.$emit('showloading') } })
axios的post请求相关问题
•如果遇到post请求跨域问题,在webpack配置文件可以设置proxyTable处理跨域问题
•传送门:https://ainyi.com/27
•post请求携带参数,需要做一次序列化:qs.stringify(reqData)
saveNormalAds(reqData){ returnAx.post('/index.php?krry',qs.stringify(reqData)); },
总结
以上所述是小编给大家介绍的详解axios中封装使用、拦截特定请求、判断所有请求加载完毕),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。