封装了错误的提示,超时返回首页等,同时比较简洁,应该能满足大部分需求。
const baseUrl = 'http://XXXX'
function request(method, url, data = {}, header = {}) {
if (!hasTokenOrIsLogin(url)) return; // 如果没有token或未登录,不发送请求
return new Promise((resolve, reject) => {
showLoading(); // 显示加载动画
uni.request({
url: baseUrl + url,
data,
method: method,
header: {
Authorization: uni.getStorageSync('token'), // 添加token到请求头
...header
},
success: (res) => handleSuccess(res, resolve, reject), // 请求成功处理
fail: (err) => handleError(err, reject) // 请求失败处理
})
})
}
function showLoading() {
uni.showLoading({
title: '加载中'
})
}
function hideLoading() {
uni.hideLoading()
}
function hasTokenOrIsLogin(url) {
// 已有token,或者当前是登录接口
return uni.getStorageSync('token') || url === '/auth/login'; // TODO 改成你的登录接口
}
function handleSuccess(response, resolve, reject) {
hideLoading(); // 隐藏加载动画
const {
statusCode,
data: resData
} = response;
const {
code,
data: innerData,
msg
} = resData;
if (statusCode === 200 && code === 200) {
resolve(innerData); // 成功时返回数据
} else if (code === 401) {
handleUnauthorizedAccess(); // 处理未授权访问
reject(msg);
} else {
showErrorMessage(msg); // 提示错误信息
reject(msg);
}
}
function handleError(error, reject) {
hideLoading(); // 隐藏加载动画
console.error(error);
reject();
}
function handleUnauthorizedAccess() {
uni.clearStorage(); // 清除本地存储
uni.reLaunch({
url: '/pages/home/home' // 重启小程序并返回到首页
});
}
function showErrorMessage(msg) {
uni.showToast({
title: msg,
icon: "none",
duration: 2000
})
}
export default {
get(url, data, header) {
return request('GET', url, data, header);
},
post(url, data, header) {
return request('POST', url, data, header);
}
}
更新:
新增文件上传,兼容h5和微信小程序
function uploadFile(url, filePath, formData, header = {}) {
if (!hasTokenOrIsLogin(url)) {
handleUnauthorizedAccess()
return
}; // 如果没有token或未登录,不发送请求
return new Promise((resolve, reject) => {
showLoading(); // 显示加载动画
uni.uploadFile({
url: baseUrl + url,
filePath,
formData,
name: 'file',
header: {
Authorization: uni.getStorageSync('token'), // 添加token到请求头
...header
},
success: (res) => handleSuccess(res, resolve, reject), // 请求成功处理
fail: (err) => handleError(err, reject) // 请求失败处理
});
})
}
使用:
filePath传入uni.chooseImage获取到的res.tempFilePaths[0]