我们所说的axios的封装和api接口的统一管理,主要目的就是在帮助我们简化代码和利于后期的更新维护。
一、axios的封装
一般我会在项目的src目录中,新建一个request文件夹,然后在里面新建一个http.js和一个api.js文件。http.js文件用来封装我们的axios,api.js用来统一管理我们的接口。
引入
环境的切换
我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址。
if(process.env.NODE_ENV == "development"){
axios.defaults.baseURL = 'http://120.53.31.103:84/'
}
if(process.env.NODE_ENV == "production"){
axios.defaults.baseURL = "https://wap.365msmk.com/"
}
设置请求超时
通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等
axios.defaults.timeout = 10000;
请求拦截
我们在发送请求前可以进行一个请求的拦截,为什么要拦截呢,我们拦截请求是用来做什么的呢?比如,有些请求是需要用户登录之后才能访问的,或者post请求的时候,我们需要序列化我们提交的数据。这时候,我们可以在请求被发送之前进行一个拦截,从而进行我们想要的操作。
axios.interceptors.request.use(
config =>{
//设置请求体
return config;
}
)
响应拦截
// 响应拦截器
axios.interceptors.response.use(
response => {
// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
// 否则的话抛出错误
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是2开头的的情况
// 这里可以跟你们的后台开发人员协商好统一的错误状态码
// 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
// 下面列举几个常见的操作,其他需求可自行扩展
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
});
响应拦截器很好理解,就是服务器返回给我们的数据,我们在拿到之前可以对他进行一些处理。例如上面的思想:如果后台返回的状态码是200,则正常返回数据,否则的根据错误的状态码类型进行一些我们需要的错误,其实这里主要就是进行了错误的统一处理和没登录或登录过期后调整登录页的一个操作。
封装get方法和post方法
get方法:我们通过定义一个get函数,get函数有两个参数,第一个参数表示我们要请求的url地址,第二个参数是我们要携带的请求参数。get函数返回一个promise对象,当axios其请求成功时resolve服务器返回 值,请求失败时reject错误值。最后通过export抛出get函数。
export function get(url,params){
return new Promise((resolve,reject)=>{
axios.get(url,{params:params}).then(res=>{
resolve(res)
}).catch(err=>{
reject(err)
})
})
}
post方法:
这里有个小细节说下,axios.get()
方法和axios.post()
在提交数据时参数的书写方式还是有区别的。区别就是,get的第二个参数是一个{},然后这个对象的params属性值是一个参数对象的。而post的第二个参数就是一个参数对象。两者略微的区别要留意哦!
*在代码的封装过程中每一步都不是必须的,根据自己的需要来封装。
axios封装就完了!!!
二、api的统一管理
上面说了,我们会新建一个api.js,然后在这个文件中存放我们所有的api接口。
首先我们在api.js中引入我们封装的get和post方法
import {get,post} from "../http/http"
现在我们有一个post请求,就可以这个样子封装:
export function mainCourse(){
return post('api/app/teacher/mainCourse')
}
我们定义了一个mainCourse方法,而后调用了我们封装的post
方法。如果有参数,post
方法的第一个参数是我们的接口地址,第二个参数是mainCourse的参数,即请求接口时携带的参数对象。最后通过export导出mainCourse。
三、在页面中使用
import {mainCourse} from '../../api/api' //导入api接口
export default {
async mounted(){
var mainC = await mainCourse()
console.log(mainC);
},