imeeting/frontend/src/api/http.ts

60 lines
1.6 KiB
TypeScript
Raw Normal View History

import axios from "axios";
import { message } from "antd";
const http = axios.create({
baseURL: "",
timeout: 15000
});
http.interceptors.request.use((config) => {
const token = localStorage.getItem("accessToken");
if (token) {
config.headers = config.headers || {};
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
http.interceptors.response.use(
(resp) => {
const body = resp.data;
// 如果返回的 code 不是 0表示业务错误
if (body && body.code !== "0") {
const errorMsg = body.msg || "请求失败";
message.error(errorMsg); // 自动展示后端错误消息
const err = new Error(errorMsg);
(err as any).code = body.code;
(err as any).msg = body.msg;
return Promise.reject(err);
}
return resp;
},
(error) => {
// 处理 HTTP 状态码错误 (4xx, 5xx)
if (error.response && (error.response.status === 401 || error.response.status === 403)) {
localStorage.removeItem("accessToken");
localStorage.removeItem("refreshToken");
sessionStorage.removeItem("userProfile");
window.location.href = "/login?timeout=1";
return Promise.reject(error);
}
const body = error.response?.data;
const errorMsg = body?.msg || error.message || "网络异常";
// 防止重复弹出相同的提示(可选逻辑,根据需要调整)
message.error(errorMsg);
if (body && body.msg) {
const err = new Error(body.msg);
(err as any).code = body.code;
(err as any).msg = body.msg;
return Promise.reject(err);
}
return Promise.reject(error);
}
);
export default http;