first
This commit is contained in:
63
admin-web/src/api/request.ts
Normal file
63
admin-web/src/api/request.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import axios from "axios";
|
||||
import { clearAdminSession, getAdminToken } from "../utils/auth";
|
||||
import { resolveApiBaseUrl } from "../utils/env";
|
||||
import { goToAdminLogin } from "../utils/navigation";
|
||||
|
||||
interface ApiPayload {
|
||||
code?: number;
|
||||
message?: string;
|
||||
data?: unknown;
|
||||
}
|
||||
|
||||
function redirectToLoginOnUnauthorized() {
|
||||
clearAdminSession();
|
||||
goToAdminLogin();
|
||||
}
|
||||
|
||||
const request = axios.create({
|
||||
baseURL: resolveApiBaseUrl(),
|
||||
timeout: 20000,
|
||||
});
|
||||
|
||||
request.interceptors.request.use((config) => {
|
||||
const token = getAdminToken();
|
||||
if (token) {
|
||||
config.headers = config.headers || {};
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
}
|
||||
return config;
|
||||
});
|
||||
|
||||
request.interceptors.response.use(
|
||||
(response) => {
|
||||
if (response.config.responseType === "blob" || response.config.responseType === "arraybuffer") {
|
||||
return response.data as any;
|
||||
}
|
||||
|
||||
const payload = response.data as ApiPayload;
|
||||
if (payload?.code === 0) {
|
||||
return payload as any;
|
||||
}
|
||||
|
||||
if (payload?.code === 401) {
|
||||
redirectToLoginOnUnauthorized();
|
||||
}
|
||||
|
||||
const error = new Error(payload?.message || "请求失败") as Error & {
|
||||
payload?: ApiPayload;
|
||||
status?: number;
|
||||
};
|
||||
error.payload = payload;
|
||||
error.status = response.status;
|
||||
return Promise.reject(error);
|
||||
},
|
||||
(error) => {
|
||||
const status = error?.response?.status;
|
||||
if (status === 401) {
|
||||
redirectToLoginOnUnauthorized();
|
||||
}
|
||||
return Promise.reject(error);
|
||||
},
|
||||
);
|
||||
|
||||
export default request;
|
||||
Reference in New Issue
Block a user