wechat_rob_mini/utils/request.js

136 lines
3.4 KiB
JavaScript

const { API_BASE_URL } = require('../config');
function buildUrl(path) {
if (!path) return '';
if (/^https?:\/\//i.test(path)) return path;
if (API_BASE_URL) return API_BASE_URL + path;
return path;
}
function getToken() {
return wx.getStorageSync('token') || '';
}
function request(options) {
const { url, method = 'GET', data, header = {} } = options || {};
return new Promise((resolve, reject) => {
wx.request({
url: buildUrl(url),
method,
data,
header: {
'Content-Type': 'application/json',
Authorization: getToken() ? `Bearer ${getToken()}` : '',
...header
},
success(res) {
if (res.statusCode === 401 || res.statusCode === 403) {
wx.removeStorageSync('token');
wx.reLaunch({ url: '/pages/login/login' });
}
resolve(res.data || { success: false, message: '响应为空' });
},
fail(err) {
reject(err);
}
});
});
}
function uploadFile(options) {
const { url, filePath, name = 'file', formData = {} } = options || {};
return new Promise((resolve, reject) => {
wx.uploadFile({
url: buildUrl(url),
filePath,
name,
formData,
header: {
Authorization: getToken() ? `Bearer ${getToken()}` : ''
},
success(res) {
try {
const data = JSON.parse(res.data || '{}');
resolve(data);
} catch (e) {
resolve({ success: false, message: '解析响应失败' });
}
},
fail(err) {
reject(err);
}
});
});
}
function downloadFile(options) {
const { url } = options || {};
return new Promise((resolve, reject) => {
wx.downloadFile({
url: buildUrl(url),
header: {
Authorization: getToken() ? `Bearer ${getToken()}` : ''
},
success(res) {
if (res.statusCode === 200) {
resolve(res.tempFilePath);
return;
}
reject(new Error('下载失败'));
},
fail(err) {
reject(err);
}
});
});
}
function buildResultView(raw) {
const result = { text: '', cards: [] };
if (raw === null || raw === undefined) return result;
if (typeof raw === 'string') {
result.text = raw;
} else {
try {
result.text = JSON.stringify(raw, null, 2);
} catch (e) {
result.text = String(raw);
}
}
let parsed = raw;
if (typeof raw === 'string') {
try {
parsed = JSON.parse(raw);
} catch (e) {
parsed = null;
}
}
if (parsed && typeof parsed === 'object') {
if (Array.isArray(parsed)) {
result.cards = parsed.slice(0, 6).map((item, index) => {
if (item && typeof item === 'object') {
const keys = Object.keys(item);
const titleKey = keys.find(k => /name|title|id/i.test(k)) || keys[0] || `item_${index + 1}`;
const titleValue = item[titleKey] !== undefined && item[titleKey] !== null ? item[titleKey] : titleKey;
return { label: String(titleValue), value: `#${index + 1}` };
}
return { label: `item_${index + 1}`, value: String(item) };
});
return result;
}
const keys = Object.keys(parsed);
result.cards = keys.slice(0, 8).map(key => ({
label: key,
value: typeof parsed[key] === 'object' ? '对象' : String(parsed[key])
}));
}
return result;
}
module.exports = { request, uploadFile, downloadFile, buildUrl, buildResultView };