client.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import axios from "axios";
  2. import { Toast } from "@douyinfe/semi-ui";
  3. // Determine base URL from environment variables, or fallback to default
  4. const DEFAULT_BASE_URL = "http://localhost:8000";
  5. // Handle various environment variable formats (Vite uses import.meta.env.VITE_*)
  6. const getBaseUrl = () => {
  7. if (typeof import.meta !== "undefined" && import.meta.env && import.meta.env.VITE_API_BASE_URL) {
  8. return import.meta.env.VITE_API_BASE_URL;
  9. }
  10. return DEFAULT_BASE_URL;
  11. };
  12. export const client = axios.create({
  13. baseURL: getBaseUrl(),
  14. });
  15. client.interceptors.response.use(
  16. (response) => response,
  17. (error) => {
  18. // Check if error has a response (server responded with status code outside 2xx)
  19. if (error.response) {
  20. const { status, data } = error.response;
  21. const message = data?.detail || data?.message || "请求失败";
  22. // Handle specific status codes
  23. if (status >= 500) {
  24. Toast.error(`服务器错误 (${status}): ${message}`);
  25. } else if (status >= 400) {
  26. Toast.error(`请求错误 (${status}): ${message}`);
  27. }
  28. } else if (error.request) {
  29. // The request was made but no response was received
  30. Toast.error("网络错误: 无法连接到服务器");
  31. } else {
  32. // Something happened in setting up the request that triggered an Error
  33. Toast.error(`请求配置错误: ${error.message}`);
  34. }
  35. return Promise.reject(error);
  36. },
  37. );
  38. export async function request<T>(
  39. path: string,
  40. init?: { method?: string; data?: unknown; params?: Record<string, unknown> },
  41. ): Promise<T> {
  42. const method = init?.method || "GET";
  43. const response = await client.request<T>({
  44. url: path,
  45. method,
  46. params: init?.params,
  47. data: init?.data,
  48. });
  49. return response.data;
  50. }