在vue项目中优雅地封装axios
- axios简介
axios 是一个用来发送网络请求的js库,返回的格式是Promise.
vue项目中基本都是用axios发起网络请求。
- 安装配置axios
- 安装axios
npm install axios --save
2. 配置axios
2.1 创建Axios实例
2.2 添加请求拦截器
2.3 添加响应拦截器
2.4 配置全局的laoding
在src/util 下面新建axios.js 文件
import axios from ‘axios’;
import { Elmessage, ElLoading } from 'element-plus'
import {ref} from 'vue'
//1.创建axios实例
const instance = axios.create({
//接口
baseUrl: '/api',
//超时时间
timeout: 3000
})
//2.请求拦截器
instance.interceptors.request.use(
config => {
let token = sessionStorage.getItem('token');
if(token) {
config .header['token'] = token
}
//加载loading
addLoading()
return config;
}
);
//3.响应拦截器
instance.interceptors.response.use(
res=>{
//取消加载loading
cancelLoading();
return res;
},
error=>{
cancelLoading();
if(error && error.response) {
const status = error.response.status
switch(status) {
case 400:
ElMessage.error("请求错误");
break;
case 401:
ElMessage.error("未授权,请重新登录");
break;
case 403:
ElMessage.error("登录过期,请重新登录");
break;
case 404:
ElMessage.error("请求错误,未找到相应的资源");
break;
case 408:
ElMessage.error("请求超时");
break;
case 500:
ElMessage.error("服务器错误");
break;
case 504:
ElMessage.error("网络超时");
break;
default:
ElMessage.error("请求失败");
} else {
if(JSON.stringify(error).includes('timeout')) {
error.code = 'TIMEOUT';
error.message='服务器响应超时'
}
}
return Promise.reject(error);
}
)
//4.配置全局loading
let loadCount = 0;
let loadingInstance = ref(null)
//加载loading
const addLoading = () =》{
loadCount++;
if(loadCount == 1) {
loadingInstance.value = ElLoading.service({
fullscreen:false,
text:'请求中...',
background: 'rgb(0,0,0,0)'
})
}
}
//取消加载loading
const cancelLoading = () =>{
loadCount--;
if(loadCount==0) {
loadingInstance.value.close();
}
}
//超出axios实例
export default instance; `
2.3 封装常用的http请求
其实就是先引入 axios 实例,然后将 axios 的几种常用网络请求封装成 Promise 并返回。
import instance from './axios'
const post = (url, data) => {
return new Promise((resolve,reject)=>{
instance.post(url,data).then((res)=>{resolve(res)}).catche(err=>reject(err)) ;
});
};
const get = (url, data) => {
return new Promise((resolve, reject) => {
instance
.get(url, { params: data })
.then((res) => {
resolve(res);
})
.catch((err) => {
reject(err);
});
});
};
const put = (url, data) => {
return new Promise((resolve, reject) => {
instance
.put(url, data)
.then((res) => {
resolve(res);
})
.catch((err) => {
reject(err);
});
});
};
const del = (url, data) => {
return new Promise((resolve, reject) => {
instance
.delete(url, { params: data })
.then((res) => {
resolve(res);
})
.catch((err) => {
reject(err);
});
});
};
export default {
post,
get,
put,
del
}
2.4 开发接口
在 /src/api 文件夹下新建接口文件
import http from "../utils/http";
// 用户登录
const login = (data) => {
return http.post("/index/user/login", data);
};
export default { login }
3.请求案例
import userApi from '../api/user'
//登录
const onSubmit = async () =>{
const res = await userApi.login(from);
if(res.data.code == 200) {
} else {
Elmesage.error(res.data.message)
}
}


浙公网安备 33010602011771号