admin-vben5/apps/web-antd/src/forward/request.ts

91 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-06-02 20:50:51 +08:00
/**
*
*/
import type { AxiosResponse } from '@vben-core/request';
import { RequestClient, isCancelError } from '@vben-core/request';
import { useCoreAccessStore } from '@vben-core/stores';
2024-06-02 20:50:51 +08:00
import { message } from 'ant-design-vue';
interface HttpResponse<T = any> {
2024-06-23 13:19:55 +08:00
/**
* 0
* 0 means success, others means fail
*/
2024-06-02 20:50:51 +08:00
code: number;
2024-06-30 14:09:44 +08:00
data: T;
2024-06-02 20:50:51 +08:00
message: string;
}
2024-06-23 13:19:55 +08:00
/**
*
* Create a request instance
*/
2024-06-02 20:50:51 +08:00
function createRequestClient() {
const client = new RequestClient({
baseURL: import.meta.env.VITE_GLOB_API_URL,
// 为每个请求携带 Authorization
makeAuthorization: () => {
return {
2024-06-23 13:19:55 +08:00
handler: () => {
// 这里不能用 useAccessStore因为 useAccessStore 会导致循环引用
const accessStore = useCoreAccessStore();
2024-06-30 14:09:44 +08:00
return {
2024-07-10 00:50:41 +08:00
refreshToken: `Bearer ${accessStore.refreshToken}`,
token: `Bearer ${accessStore.accessToken}`,
2024-06-30 14:09:44 +08:00
};
2024-06-02 20:50:51 +08:00
},
// 默认
2024-06-23 13:19:55 +08:00
key: 'Authorization',
2024-06-02 20:50:51 +08:00
};
},
});
setupRequestInterceptors(client);
2024-06-30 14:09:44 +08:00
return client;
2024-06-02 20:50:51 +08:00
}
function setupRequestInterceptors(client: RequestClient) {
client.addResponseInterceptor(
(response: AxiosResponse<HttpResponse>) => {
const { data: responseData, status } = response;
2024-06-30 14:09:44 +08:00
const { code, data, message: msg } = responseData;
if (status >= 200 && status < 400 && code === 0) {
return data;
2024-06-02 20:50:51 +08:00
} else {
message.error(msg);
throw new Error(msg);
}
},
(error: any) => {
if (isCancelError(error)) {
return Promise.reject(error);
}
const err: string = error?.toString?.() ?? '';
let errMsg = '';
if (err?.includes('Network Error')) {
errMsg = '网络错误。';
} else if (error?.message?.includes?.('timeout')) {
errMsg = '请求超时。';
} else {
2024-06-30 14:09:44 +08:00
const data = error?.response?.data;
errMsg = (data?.message || data?.error?.message) ?? '';
2024-06-02 20:50:51 +08:00
}
2024-06-30 14:09:44 +08:00
2024-06-02 20:50:51 +08:00
message.error(errMsg);
return Promise.reject(error);
},
);
}
2024-06-30 14:09:44 +08:00
const requestClient = createRequestClient();
2024-06-02 20:50:51 +08:00
// 其他配置的请求方法
// const { request: xxxRequest } = createRequest();
2024-06-30 14:09:44 +08:00
export { requestClient };