// pwuniapp/common/request.js // 同城生活陪伴小程序统一网络请求层 // 统一API基地址配置 const BASE_URL = (() => { // #ifdef H5 // H5环境使用相对路径 /api,通过Nginx/本地代理转发,天然规避CORS跨域 return '/api'; // #endif // 小程序端与App端使用HTTPS公网生产地址 return 'https://peiww.gynhc.com/api'; })(); /** * 通用网络请求函数 * @param {Object} options 请求参数 * @returns {Promise} 返回请求结果 */ // 登录过期提示仅一次,避免并发请求重复弹窗 let authExpiredNotified = false; function handleAuthExpired(hadSession = false) { let hadLocalAuth = Boolean(hadSession); try { if (!hadLocalAuth) { hadLocalAuth = Boolean(uni.getStorageSync('userToken') || uni.getStorageSync('userId')); } uni.removeStorageSync('userToken'); uni.removeStorageSync('userId'); uni.removeStorageSync('userInfo'); uni.removeStorageSync('PW_USER_INFO'); } catch (_) { // 忽略本地存储清理异常 } // 仅当本地原本存在登录会话却被服务端判定失效时才提示“登录已过期”;未登录游客静默忽略 if (hadLocalAuth && !authExpiredNotified) { authExpiredNotified = true; try { uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' }); } catch (_) { // ignore } } } export function request(options = {}) { let url = options.url || ''; if (!url.startsWith('http')) { const cleanUrl = url.startsWith('/') ? url : `/${url}`; url = `${BASE_URL}${cleanUrl}`; } const method = (options.method || 'GET').toUpperCase(); let sessionToken = ''; let hadSession = false; try { sessionToken = uni.getStorageSync('userToken') || ''; hadSession = Boolean(sessionToken || uni.getStorageSync('userId')); } catch (_) { sessionToken = ''; } const header = { 'Content-Type': 'application/json', ...(sessionToken ? { Authorization: `Bearer ${sessionToken}` } : {}), ...options.header, }; return new Promise((resolve, reject) => { uni.request({ url, method, data: options.data || {}, header, timeout: options.timeout || 10000, success: (res) => { if (res.statusCode >= 200 && res.statusCode < 300) { // 适配标准的业务封装 { code: 20000, data: ... } if (res.data && typeof res.data === 'object' && 'code' in res.data) { if (res.data.code === 20000) { if (sessionToken) authExpiredNotified = false; resolve(res.data.data); } else { const bizErr = new Error(res.data.message || '业务请求失败'); bizErr.code = res.data.code; bizErr.statusCode = res.statusCode; if (res.data.code === 40100) handleAuthExpired(hadSession); else if (res.data.code === 40300 && /身份校验失败|无权以他人身份/.test(res.data.message || '')) handleAuthExpired(hadSession); reject(bizErr); } } else { resolve(res.data); } } else { const errMsg = (res.data && res.data.message) ? res.data.message : `HTTP请求失败: ${res.statusCode}`; const httpErr = new Error(errMsg); httpErr.statusCode = res.statusCode; httpErr.code = (res.data && res.data.code) || res.statusCode; if (res.statusCode === 401) handleAuthExpired(hadSession); else if (res.statusCode === 403 && /身份校验失败|无权以他人身份/.test(errMsg)) handleAuthExpired(hadSession); reject(httpErr); } }, fail: (err) => { reject(new Error(err.errMsg || '网络请求异常,请检查网络连接')); }, }); }); } export default { get: (url, data, header) => request({ url, method: 'GET', data, header }), post: (url, data, header) => request({ url, method: 'POST', data, header }), put: (url, data, header) => request({ url, method: 'PUT', data, header }), delete: (url, data, header) => request({ url, method: 'DELETE', data, header }), };