Files
20260512-skg-tk/web/canvas-app/src/utils/request.js

89 lines
2.0 KiB
JavaScript

/**
* HTTP Request Utility | HTTP 请求工具
* Axios-based request with interceptors
*/
import axios from 'axios'
// Base URL from environment or default
// Create axios instance | 创建 axios 实例
const instance = axios.create({
baseURL: "/api",
timeout: 30000000
})
// Request interceptor | 请求拦截器
instance.interceptors.request.use(
(config) => {
return config
},
(error) => {
console.error('Request error:', error)
return Promise.reject(error)
}
)
// Response interceptor | 响应拦截器
instance.interceptors.response.use(
(res) => {
const { data, code, message } = res.data || {}
// Handle stream response | 处理流响应
if (res.config.responseType === 'stream') {
return res.data
}
// Handle blob response | 处理 blob 响应
if (res.data instanceof Blob) {
return res.data
}
// Success response | 成功响应
if (code === 200 || res.status === 200) {
return res.data
}
// Error response | 错误响应
window.$message?.error(message || 'Request failed')
return Promise.reject(res.data)
},
(error) => {
const { response } = error
if (response) {
const { status, data } = response
const message = data?.message || data?.error?.message || error.message
if (status === 401) {
window.$message?.error('登录已过期,请重新进入工作台')
} else if (status === 429) {
window.$message?.error('请求过于频繁,请稍后再试')
} else {
window.$message?.error(message || '请求失败')
}
} else {
window.$message?.error(error.message || '网络错误')
}
return Promise.reject(error)
}
)
/**
* Set API base URL | 设置 API 基础 URL
* @param {string} url - Base URL
*/
export const setBaseUrl = (url) => {
instance.defaults.baseURL = url
}
/**
* Get current base URL | 获取当前基础 URL
* @returns {string}
*/
export const getBaseUrl = () => {
return instance.defaults.baseURL
}
export default instance