vue如何封装axios
今天主机评测网小编给大家分享一下vue如何封装axios的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
vue封装axios可以提高代码质量、让使用更为便利。axios的API很友好,开发者完全可以很轻松地在项目中直接使用;不过随着项目规模增大,如果每发起一次HTTP请求,需要写一遍设置超时时间、设置请求头、错误处理等等操作。这种重复劳动不仅浪费时间,而且让代码变得冗余不堪,难以维护;为了提高我们的代码质量,应该在项目中二次封装一下axios再使用,这样可以让使用更为便利。
axios是什么
axios 是一个轻量的 HTTP客户端
基于 XMLHttpRequest 服务来执行 HTTP 请求,支持丰富的配置,支持 Promise,支持浏览器端和 Node.js 端。自Vue2.0起,尤大宣布取消对 vue-resource 的官方推荐,转而推荐 axios。现在 axios 已经成为大部分 Vue 开发者的首选
为什么要封装
axios 的 API 很友好,你完全可以很轻松地在项目中直接使用。
不过随着项目规模增大,如果每发起一次HTTP请求,就要把这些比如设置超时时间、设置请求头、根据项目环境判断使用哪个请求地址、错误处理等等操作,都需要写一遍
这种重复劳动不仅浪费时间,而且让代码变得冗余不堪,难以维护。为了提高我们的代码质量,我们应该在项目中二次封装一下 axios 再使用
举个例子:
axios('localhost:3000/data',{//配置代码method:'GET',timeout:1000,withCredentials:true,headers:{'Content-Type':'application/json',Authorization:'xxx',},transformRequest:[function(data,headers){returndata;}],//其他请求配置...}).then((data)=>{//todo:真正业务逻辑代码console.log(data);},(err)=>{//错误处理代码if(err.response.status===401){//handleauthorizationerror}if(err.response.status===403){//handleserverforbiddenerror}//其他错误处理.....console.log(err);});
如果每个页面都发送类似的请求,都要写一堆的配置与错误处理,就显得过于繁琐了
这时候我们就需要对axios进行二次封装,让使用更为便利
如何封装
封装的同时,你需要和 后端协商好一些约定,请求头,状态码,请求超时时间.......
设置接口请求前缀:根据开发、测试、生产环境的不同,前缀需要加以区分
请求头 : 来实现一些具体的业务,必须携带一些参数才可以请求(例如:会员业务)
状态码: 根据接口返回的不同status , 来执行不同的业务,这块需要和后端约定好
请求方法:根据get、post等方法进行一个再次封装,使用起来更为方便
请求拦截器: 根据请求的请求头设定,来决定哪些请求可以访问
响应拦截器: 这块就是根据 后端`返回来的状态码判定执行不同业务
设置接口请求前缀
利用node环境变量来作判断,用来区分开发、测试、生产环境
if(process.env.NODE_ENV==='development'){axios.defaults.baseURL='dev.xxx'}elseif(process.env.NODE_ENV==='production'){axios.defaults.baseURL='prod.xxx'}
在本地调试的时候,还需要在vue.config.js文件中配置devServer实现代理转发,从而实现跨域
devServer:{proxy:{'/proxyApi':{target:'dev.xxx',changeOrigin:true,pathRewrite:{'/proxyApi':''}}}}
设置请求头与超时时间
大部分情况下,请求头都是固定的,只有少部分情况下,会需要一些特殊的请求头,这里将普适性的请求头作为基础配置。当需要特殊请求头时,将特殊请求头作为参数传入,覆盖基础配置
constservice=axios.create({...timeout:30000,//请求30s超时headers:{get:{'Content-Type':'application/x-form-urlencoded;charset=utf-8'//在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来},post:{'Content-Type':'application/json;charset=utf-8'//在开发中,一般还需要单点登录或者其他功能的通用请求头,可以一并配置进来}},})
封装请求方法
先引入封装好的方法,在要调用的接口重新封装成一个方法暴露出去
//get请求exportfunctionhttpGet({url,params={}}){returnnewPromise((resolve,reject)=>{axios.get(url,{params}).then((res)=>{resolve(res.data)}).catch(err=>{reject(err)})})}//post//post请求exportfunctionhttpPost({url,data={},params={}}){returnnewPromise((resolve,reject)=>{axios({url,method:'post',transformRequest:[function(data){letret=''for(letitindata){ret+=encodeURponent(it)+'='+encodeURponent(data[it])+'&'}returnret}],//发送的数据data,//url参数params}).then(res=>{resolve(res.data)})})}
把封装的方法放在一个api.js文件中
import{httpGet,httpPost}from'./http'exportconstgetorglist=(params={})=>httpGet({url:'apps/api/org/list',params})
页面中就能直接调用
//.vueimport{getorglist}from'@/assets/js/api'getorglist({id:200}).then(res=>{console.log(res)})
这样可以把api统一管理起来,以后维护修改只需要在api.js文件操作即可
请求拦截器
请求拦截器可以在每个请求里加上token,做了统一处理后维护起来也方便
//请求拦截器axios.interceptors.request.use(config=>{//每次发送请求之前判断是否存在token//如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况,此处token一般是用户完成登录后储存到localstorage里的token&&(config.headers.Authorization=token)returnconfig},error=>{returnPromise.error(error)})
响应拦截器
响应拦截器可以在接收到响应后先做一层操作,如根据状态码判断登录状态、授权
//响应拦截器axios.interceptors.response.use(response=>{//如果返回的状态码为200,说明接口请求成功,可以正常拿到数据//否则的话抛出错误if(response.status===200){if(response.data.code===511){//未授权调取授权接口}elseif(response.data.code===510){//未登录跳转登录页}else{returnPromise.resolve(response)}}else{returnPromise.reject(response)}},error=>{//我们可以在这里对异常状态作统一处理if(error.response.status){//处理请求失败的情况//对不同返回码对相应处理returnPromise.reject(error.response)}})
以上就是“vue如何封装axios”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注主机评测网行业资讯频道。
上一篇:vue组件中data能不能是函数