108 lines
3.4 KiB
JavaScript
108 lines
3.4 KiB
JavaScript
import axios from 'axios'
|
||
import { resReject, resResolve, reqReject, reqResolve } from './interceptors'
|
||
import { getCurrentEndpoint, getAvailableEndpoints } from '../api-config'
|
||
|
||
export function createAxios(options = {}) {
|
||
const defaultOptions = {
|
||
timeout: 12000,
|
||
}
|
||
const service = axios.create({
|
||
...defaultOptions,
|
||
...options,
|
||
})
|
||
service.interceptors.request.use(reqResolve, reqReject)
|
||
service.interceptors.response.use(resResolve, resReject)
|
||
return service
|
||
}
|
||
|
||
// 创建支持多接口的请求实例
|
||
export function createMultiEndpointRequest() {
|
||
let instances = null
|
||
|
||
// 延迟创建axios实例
|
||
function ensureInstances() {
|
||
if (!instances) {
|
||
instances = {}
|
||
const endpoints = getAvailableEndpoints()
|
||
|
||
console.log('创建axios实例,接口列表:', endpoints)
|
||
|
||
endpoints.forEach((endpoint) => {
|
||
console.log(`创建实例 ${endpoint.key}:`, endpoint.baseURL)
|
||
instances[endpoint.key] = createAxios({
|
||
baseURL: endpoint.baseURL,
|
||
timeout: endpoint.timeout,
|
||
})
|
||
})
|
||
}
|
||
return instances
|
||
}
|
||
|
||
return {
|
||
// 使用当前选中的接口发送请求
|
||
async request(config) {
|
||
const instances = ensureInstances()
|
||
const currentEndpoint = getCurrentEndpoint()
|
||
|
||
console.log('当前接口配置:', currentEndpoint)
|
||
console.log('可用实例:', Object.keys(instances))
|
||
|
||
const instance = instances[currentEndpoint.key]
|
||
|
||
if (!instance) {
|
||
throw new Error(`接口实例不存在: ${currentEndpoint.key}`)
|
||
}
|
||
|
||
console.log(`使用接口: ${currentEndpoint.name} (${currentEndpoint.baseURL})`)
|
||
console.log('请求配置:', config)
|
||
|
||
return await instance(config)
|
||
},
|
||
|
||
// 获取当前接口实例
|
||
getCurrentInstance() {
|
||
const instances = ensureInstances()
|
||
const currentEndpoint = getCurrentEndpoint()
|
||
return instances[currentEndpoint.key]
|
||
},
|
||
|
||
// 获取所有接口实例
|
||
getAllInstances() {
|
||
return ensureInstances()
|
||
},
|
||
}
|
||
}
|
||
|
||
// export const request = createAxios({
|
||
// baseURL: import.meta.env.VITE_BASE_API,
|
||
// })
|
||
|
||
// 支持多接口的请求实例
|
||
export const multiRequest = createMultiEndpointRequest()
|
||
|
||
// 创建自动适配多接口的request实例
|
||
const multiEndpointInstance = createMultiEndpointRequest()
|
||
|
||
// 创建支持axios方法的request实例
|
||
export const request = {
|
||
// 基础请求方法
|
||
request: (config) => multiEndpointInstance.request(config),
|
||
|
||
// 自动适配axios方法
|
||
get: (url, config = {}) => multiEndpointInstance.request({ method: 'get', url, ...config }),
|
||
post: (url, data, config = {}) =>
|
||
multiEndpointInstance.request({ method: 'post', url, data, ...config }),
|
||
put: (url, data, config = {}) =>
|
||
multiEndpointInstance.request({ method: 'put', url, data, ...config }),
|
||
delete: (url, config = {}) => multiEndpointInstance.request({ method: 'delete', url, ...config }),
|
||
patch: (url, data, config = {}) =>
|
||
multiEndpointInstance.request({ method: 'patch', url, data, ...config }),
|
||
head: (url, config = {}) => multiEndpointInstance.request({ method: 'head', url, ...config }),
|
||
options: (url, config = {}) =>
|
||
multiEndpointInstance.request({ method: 'options', url, ...config }),
|
||
|
||
// 获取当前接口实例(用于直接访问axios实例)
|
||
getCurrentInstance: () => multiEndpointInstance.getCurrentInstance(),
|
||
getAllInstances: () => multiEndpointInstance.getAllInstances(),
|
||
}
|