import i18n from '@/locale' import { getEnvBaseUrl } from '@/utils' import { platform } from '@/utils/platform' import { stringifyQuery } from '@/utils/queryString' export type CustomRequestOptions = UniApp.RequestOptions & { query?: Record /** 出错时是否隐藏错误提示 */ hideErrorToast?: boolean } & IUniUploadFileOptions // 添加uni.uploadFile参数类型 // 请求基准地址 const baseUrl = getEnvBaseUrl() // 获取对应前缀的请求地址和处理前缀替换 function getBaseUrlAndProcessPrefix(url: string): { baseUrl: string, processedUrl: string } { const mallPrefix = import.meta.env.VITE_SERVER_BASEURL_PREFIX || '/mall' const cifPrefix = import.meta.env.VITE_API_SECONDARY_URL_PREFIX || '/cif' const operatingPrefix = import.meta.env.VITE_API_THIRD_URL_PREFIX || '/operating' let targetBaseUrl = baseUrl let processedUrl = url if (url.startsWith(mallPrefix)) { targetBaseUrl = import.meta.env.VITE_SERVER_BASEURL || baseUrl // 检查是否需要替换前缀 if (import.meta.env.VITE_SERVER_BASEURL_PREFIX_REPLACE === 'true') { const replaceValue = import.meta.env.VITE_SERVER_BASEURL_PREFIX_REPLACE_VALUE || '' processedUrl = url.replace(mallPrefix, replaceValue) } } else if (url.startsWith(cifPrefix)) { targetBaseUrl = import.meta.env.VITE_API_SECONDARY_URL || baseUrl // 检查是否需要替换前缀 if (import.meta.env.VITE_API_SECONDARY_URL_PREFIX_REPLACE === 'true') { const replaceValue = import.meta.env.VITE_API_SECONDARY_URL_PREFIX_REPLACE_VALUE || '' processedUrl = url.replace(cifPrefix, replaceValue) } } else if (url.startsWith(operatingPrefix)) { targetBaseUrl = import.meta.env.VITE_API_THIRD_URL || baseUrl // 检查是否需要替换前缀 if (import.meta.env.VITE_API_THIRD_URL_PREFIX_REPLACE === 'true') { const replaceValue = import.meta.env.VITE_API_THIRD_URL_PREFIX_REPLACE_VALUE || '' processedUrl = url.replace(operatingPrefix, replaceValue) } } return { baseUrl: targetBaseUrl, processedUrl } } // 拦截器配置 const httpInterceptor = { // 拦截前触发 invoke(options: CustomRequestOptions) { // 接口请求支持通过 query 参数配置 queryString if (options.query) { const queryStr = stringifyQuery(options.query) if (options.url.includes('?')) { options.url += `&${queryStr}` } else { options.url += `?${queryStr}` } } // 非 http 开头需拼接地址 if (!options.url.startsWith('http')) { // 根据URL前缀获取对应的基础地址和处理前缀替换 const { baseUrl: targetBaseUrl, processedUrl } = getBaseUrlAndProcessPrefix(options.url) // #ifdef H5 // console.log(__VITE_APP_PROXY__) if (JSON.parse(__VITE_APP_PROXY__)) { // 自动拼接代理前缀 options.url = import.meta.env.VITE_APP_PROXY_PREFIX + processedUrl } else { options.url = targetBaseUrl + processedUrl } // #endif // 非H5正常拼接 // #ifndef H5 options.url = targetBaseUrl + processedUrl // #endif } // 1. 请求超时 options.timeout = 10000 // 10s // 2. (可选)添加小程序端请求头标识 options.header = { platform, // 可选,与 uniapp 定义的平台一致,告诉后台来源 ...options.header, } options.header.language = i18n.global.locale // 判断是否为登录接口 const isLoginApi = options.url?.includes('/login') || options.url?.includes('/register') // 如果不是登录接口,添加 token 请求头 if (!isLoginApi) { const token = uni.getStorageSync('token') if (token) { options.header.Token = token } } }, } export const requestInterceptor = { install() { // 拦截 request 请求 uni.addInterceptor('request', httpInterceptor) // 拦截 uploadFile 文件上传 uni.addInterceptor('uploadFile', httpInterceptor) }, }