import axios, { AxiosRequestConfig, AxiosPromise } from 'axios'; import 'utils/http'; // 导入接口定义 import * as PORTAL from './apis/PORTAL'; const APICollection = { PORTAL }; interface APIInstance { (...args: Array): string; request(config: AxiosRequestConfig, ...args: Array): AxiosPromise; get(...args: Array): AxiosPromise; get(config: AxiosRequestConfig, ...args: Array): AxiosPromise; delete(...args: Array): AxiosPromise; delete(config: AxiosRequestConfig, ...args: Array): AxiosPromise; head(...args: Array): AxiosPromise; head(config: AxiosRequestConfig, ...args: Array): AxiosPromise; post(...args: Array): AxiosPromise; post(configOrData: AxiosRequestConfig | any, ...args: Array): AxiosPromise; post(data: any, config: AxiosRequestConfig, ...args: Array): AxiosPromise; put(...args: Array): AxiosPromise; put(configOrData: AxiosRequestConfig | any, ...args: Array): AxiosPromise; put(data: any, config: AxiosRequestConfig, ...args: Array): AxiosPromise; patch(...args: Array): AxiosPromise; patch(configOrData: AxiosRequestConfig | any, ...args: Array): AxiosPromise; patch(data: any, config: AxiosRequestConfig, ...args: Array): AxiosPromise; } type APIPicker = { [P in keyof T]: API }; type API = { [P in keyof T]: T[P] extends object ? API : APIInstance }; const isDev = process.env.NODE_ENV === 'development' || process.env.REACT_APP_ENV === 'development'; export const axiosMethods = ['request', 'get', 'post', 'put', 'delete', 'head', 'patch']; export default Object.keys(APICollection).reduce((exports, host) => { exports[host] = enhanced(APICollection[host]); return exports; }, {}) as APIPicker; function enhanced(config) { const createAPI = apis => Object.keys(apis).reduce((result, key) => { const pathname = apis[key]; function apiInstance(...args) { let index = 0; const host = isDev ? config.HOST[0] : config.HOST[1]; return ( host + pathname.replace(/:[^/]+/gi, match => { const arg = args[index++]; return arg === undefined ? match : arg; }) ); } axiosMethods.forEach(type => { apiInstance[type] = (...args) => { const apiArgs: Array = []; const httpArgs: object[] = []; args.forEach(item => { if (typeof item === 'string' || typeof item === 'number') { apiArgs.push(item); } else { httpArgs.push(item); } }); // 针对request方法特殊处理 if (type === 'request') { return axios.request({ ...httpArgs[0], url: apiInstance(...apiArgs) }); } return axios[type](apiInstance(...apiArgs), ...httpArgs); }; }); result[key] = typeof pathname === 'string' ? apiInstance : createAPI(pathname); return result; }, {}); return createAPI(config.API); } /** * 根据配置的HOST_ALIAS切换host */ export function setAlias(name: string) { Object.keys(APICollection).forEach(host => { const config = APICollection[host]; if (config.HOST_ALIAS && name in config.HOST_ALIAS) { config.HOST.splice(0, 2, ...config.HOST_ALIAS[name]); } }); }