vue3 axios 的封装与 vue2 整体相同,细节需注意。整体思路可分为四步:
- 创建一个新的 axios 实例
- 请求拦截器,携带 token
- 响应拦截器:剥离无效数据、处理 token 失效
- 导出一个函数,调用 axios 发请求
1. 创建实例-配置基础 URL
import axios from "axios";
import store from "@/store";
import router from "@/router";
export const baseURL = "http://pcapi-xiaotuxian-front-devtest.itheima.net/";
const instance = axios.create({
baseURL,
timeout: 5000,
});
2. 拦截请求,将 token 携带到请求体
instance.interceptors.request.use(
(config) => {
const profile = store.state.user.profile;
if (profile.token) {
config.headers.Authorization = `Bearer ${profile.token}`;
}
return config;
},
(err) => {
return Promise.reject(err);
}
);
3. 响应拦截—清空本地无效信息—跳转到登录页面,并且需携带当前路由地址给登录页,以便登录成功后返回原页面
instance.interceptors.response.use(
(res) => {
return res.data;
},
(err) => {
if (err.response && err.response.status === 401) {
store.commit("user/setUser", {});
const fullPath = encodeURIComponent(router.currentRoute.value.fullPath);
router.push("/login?redirectUrl=" + "");
}
return Promise.reject(err);
}
);
4. 配置请求函数,将函数暴露出去
export default (url, method, submitData) => {
return instance({
url,
method,
[method.toLowerCase() === "get" ? "params" : "data"]: submitData,
});
};