Files
2026-01-16 19:14:26 +08:00

107 lines
3.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// utils/request.js(或你当前文件)
import { useUserStore } from '@/store/user';
export const baseUrl = import.meta.env.VITE_APP_BASE_URL;
const appVersion = uni.getSystemInfoSync().appVersion;
// 对 uni.request 的封装
export const request = (options = {}) => {
return new Promise((resolve, reject) => {
const userStore = useUserStore();
// 👇 关键修改:默认 Content-Type 为 application/json
const contentType = options.header?.['Content-Type'] || 'application/json';
// 公共参数
const commonParams = {
__token: userStore.userToken,
__platform: userStore.platform,
__language: userStore.lang,
};
// 合并 data
let requestData = {
...options.data,
...commonParams,
};
// 👇 如果是 JSON,data 保持为对象(uni.request 会自动序列化)
// 如果是 x-www-form-urlencoded,需要手动转成字符串(但不推荐)
if (contentType === 'application/x-www-form-urlencoded') {
// 注意:uni.request 在非 H5 平台可能不支持直接传对象 + x-www-form-urlencoded
// 所以这里需要手动拼接
const params = new URLSearchParams();
for (const key in requestData) {
if (requestData[key] !== undefined && requestData[key] !== null) {
params.append(key, requestData[key]);
}
}
requestData = params.toString(); // 转为 a=1&b=2 形式
}
// 如果是 application/json,requestData 保持为对象即可
uni
.request({
url: baseUrl + (options.url || ''),
method: options.method || 'GET',
data: requestData, // 对象 or 字符串
header: {
'Content-Type': contentType,
'Authorization': 'Bearer ' + userStore.token,
// version: appVersion, // 如需可加
...options.header,
},
})
.then((res) => {
if (res.statusCode === 401) {
userStore.userToken = '';
userStore.clearProfile();
userStore.isLogin = false;
}
resolve({
...res.data,
statusCode: res.statusCode,
});
})
.catch((error) => {
if (error.statusCode === 401) {
userStore.userToken = '';
userStore.clearProfile();
userStore.isLogin = false;
reject({
...error.data,
statusCode: error.statusCode,
});
} else {
uni.showToast({
duration: 2500,
icon: 'none',
mask: true,
title: 'Server exception, please try again later',
});
setTimeout(() => {
uni.hideLoading();
reject(error.data);
}, 2000);
}
});
});
};
// 导出方法(保持不变)
export const get = (url, data = {}, options = {}) => {
return request({ ...options, url, method: 'GET', data });
};
export const post = (url, data = {}, options = {}) => {
return request({ ...options, url, method: 'POST', data });
};
export const put = (url, data = {}, options = {}) => {
return request({ ...options, url, method: 'PUT', data });
};
export const dele = (url, data = {}, options = {}) => {
return request({ ...options, url, method: 'DELETE', data });
};