/** * 统一的 HTTP 请求封装 * 自动添加 tenantId、token 等公共参数 */ import { getApiUrl } from './config.js' /** * 获取 tenantId(从本地存储) */ function getTenantId() { try { return uni.getStorageSync('backend-tenant-id') || '' } catch (e) { console.error('获取 tenantId 失败:', e) return '' } } /** * 获取 token(从本地存储) */ function getToken() { try { return uni.getStorageSync('backend-token') || '' } catch (e) { console.error('获取 token 失败:', e) return '' } } /** * 统一的请求方法 * @param {Object} options - uni.request 的配置选项 * @param {string} options.url - 请求地址(会自动使用 getApiUrl 处理) * @param {string} options.method - 请求方法,默认 'GET' * @param {Object} options.data - 请求数据 * @param {Object} options.header - 请求头(会自动合并公共 header) * @param {number} options.timeout - 超时时间 * @param {boolean} options.needTenantId - 是否需要添加 tenantId,默认 true * @param {boolean} options.needToken - 是否需要添加 token,默认 true * @returns {Promise} 请求结果 */ export function request(options = {}) { const { url, method = 'GET', data = {}, header = {}, timeout = 10000, needTenantId = true, needToken = true, ...restOptions } = options // 处理 URL(自动添加 baseUrl) const fullUrl = url.startsWith('http') ? url : getApiUrl(url) // 构建请求头 const requestHeader = { 'Content-Type': 'application/json', ...header } // 添加 token(如果需要) if (needToken) { const token = getToken() if (token) { requestHeader['Authorization'] = `Bearer ${token}` // 或者使用其他 header 名称,根据后端要求调整 // requestHeader['X-Token'] = token } } // 处理请求数据 let requestData = { ...data } // 添加 tenantId 到 X-Tenant-Id header // 技术方案:登录返回的 LoginResponse 中包含 tenantId,前端保存后自动添加到所有请求的 header 中 if (needTenantId) { const tenantId = getTenantId() if (tenantId) { // 将 tenantId 放入 X-Tenant-Id header(适用于所有请求类型:GET、POST、PUT、DELETE) requestHeader['X-Tenant-Id'] = tenantId // 添加日志,证明已发送 X-Tenant-Id header console.log('[Request] ✅ 已添加 X-Tenant-Id header:', { url: finalUrl, method: method.toUpperCase(), 'X-Tenant-Id': tenantId, headers: { ...requestHeader } }) } else { console.warn('[Request] ⚠️ 未找到 tenantId,请求可能失败。请确保已登录并获取到 tenantId') } } // 发起请求 return new Promise((resolve, reject) => { uni.request({ url: finalUrl, method: method.toUpperCase(), data: requestData, header: requestHeader, timeout, ...restOptions, success: (res) => { // 请求成功时也输出日志,确认 header 已发送 if (needTenantId && requestHeader['X-Tenant-Id']) { console.log('[Request] ✅ 请求成功,已发送 X-Tenant-Id:', { url: finalUrl, method: method.toUpperCase(), 'X-Tenant-Id': requestHeader['X-Tenant-Id'], statusCode: res.statusCode }) } resolve(res) }, fail: (err) => { console.error('[Request] ❌ 请求失败:', { url: finalUrl, method: method.toUpperCase(), 'X-Tenant-Id': requestHeader['X-Tenant-Id'] || '未设置', error: err }) reject(err) } }) }) } /** * GET 请求快捷方法 */ export function get(url, data = {}, options = {}) { return request({ url, method: 'GET', data, ...options }) } /** * POST 请求快捷方法 */ export function post(url, data = {}, options = {}) { return request({ url, method: 'POST', data, ...options }) } /** * PUT 请求快捷方法 */ export function put(url, data = {}, options = {}) { return request({ url, method: 'PUT', data, ...options }) } /** * DELETE 请求快捷方法 */ export function del(url, data = {}, options = {}) { return request({ url, method: 'DELETE', data, ...options }) }