import Request from './luch-request/index.js'; // 基础的url const baseUrl = 'https://yingji.hexieapi.com/prod-api'; // const baseUrl = 'http://192.168.1.168:5004'; const http = new Request({ baseURL: baseUrl, timeout: 10000 }) // 动态获取 token(从登录接口存储的) const getToken = () => { const token = uni.getStorageSync('token'); return token ? `Bearer ${token}` : ''; }; // 请求之前查看是否为空 const isEmptyObject = (obj) => { return Object.keys(obj).length === 0; }; // 将对象转换为查询字符串 const objectToQueryString = (obj) => { const keyValuePairs = []; for (let key in obj) { if (obj.hasOwnProperty(key)) { keyValuePairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); } } return keyValuePairs.join('&'); }; // 提示(延迟显示,避免和 hideLoading 冲突) function showToast(title) { setTimeout(() => { uni.showToast({ title, icon: 'none', duration: 2000, }); }, 100); } // 请求 const requestAPI = (config) => { // 支持对象参数或传统参数 let { url, method = 'GET', data = {}, noAuth = false } = typeof config === 'object' && config.url ? config : { url: config, method: arguments[1] || 'GET', data: arguments[2] || {} }; if (method == 'GET' && !isEmptyObject(data)) { url += '?' + objectToQueryString(data); } // 显示加载状态 uni.showLoading({ title: '加载中...' }); // 构建 header,登录等接口不需要 Authorization const header = { 'Content-Type': 'application/json' }; if (!noAuth) { const token = getToken(); if (token) { header['Authorization'] = token; } } return new Promise((resolve, reject) => { uni.request({ url: baseUrl + url, method, data, header, success: (res) => { uni.hideLoading(); // 检查HTTP状态码 if (res.statusCode !== 200) { console.error('HTTP错误:', res.statusCode); // showToast(`请求失败 ${res.statusCode}`); reject(`HTTP_${res.statusCode}`); return; } // 检查业务状态码(如果后端有的话) if (res.data && res.data.code !== undefined) { // 支持 code === 200 或 code === 0 作为成功状态 if (res.data.code === 200 || res.data.code === 0 || res.code === 0) { resolve(res.data); } else if (res.data.code === 401) { // token过期处理 uni.removeStorageSync('token'); uni.removeStorageSync('userInfo'); showToast('登录已过期,请重新登录'); setTimeout(() => { uni.reLaunch({ url: '/pages/login/login' }); }, 1500); reject({ code: 401, msg: '登录已过期' }); } else { // 支持多种错误信息字段:msg、message、error const errorMsg = res.data.msg || res.data.message || res.data.error || res.msg || '请求失败'; console.error('接口错误:', res.data); // 打印完整错误信息便于调试 showToast(errorMsg); // reject 时传递完整错误信息,方便页面获取 reject({ code: res.data.code, msg: errorMsg, data: res.data }); } } else { // 没有业务状态码,直接返回数据 resolve(res.data); } }, fail: (err) => { console.error('网络请求失败:', err); uni.hideLoading(); // 区分不同的错误类型 if (err.errMsg && err.errMsg.includes('request:fail')) { showToast('网络连接失败,请检查网络设置'); } else if (err.errMsg && err.errMsg.includes('timeout')) { showToast('请求超时,请稍后重试'); } else { showToast('网络异常,请稍后重试'); } reject(err); } }); }); }; // 文件末尾应该导出 export { requestAPI, baseUrl, getToken };