his-weapp/utils/request.js
2026-01-15 15:05:29 +08:00

154 lines
4.9 KiB
JavaScript
Raw 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
// 配置API基础URL
// const BASE_URL = "https://api.gzshuxing.cn"; // 请根据实际API地址修改
// const BASE_URL = "http://100.82.191.127:3000"; // 旧的API地址
// const BASE_URL = "http://100.82.191.127:8000"; // ThinkPHP 8 API地址
// const BASE_URL = "http://localhost:8000"
const BASE_URL = "http://eacgh.cn:8000"
/**
* 封装的网络请求工具
* @param {String} url 请求路径
* @param {String} method 请求方法
* @param {Object} data 请求数据
* @param {Boolean} needAuth 是否需要携带token
* @returns {Promise} 返回Promise对象
*/
const request = (url, method = "GET", data = {}, needAuth = false) => {
// 完整请求地址
const requestUrl = BASE_URL + url;
// 请求头
const header = {
"content-type": "application/json",
};
// 如果需要token从本地存储获取token并添加到请求头
if (needAuth) {
const token = wx.getStorageSync("token");
if (token) {
header["Authorization"] = `Bearer ${token}`;
} else {
// 如果是刷新token接口允许在没有token的情况下调用
if (url === "/api/user/refresh-token") {
// 允许刷新token接口在没有token的情况下调用
} else {
// 如果需要认证但没有token可能需要跳转到登录页
return Promise.reject(new Error("未登录或登录已过期"));
}
}
}
// 返回Promise
return new Promise((resolve, reject) => {
wx.request({
url: requestUrl,
method,
data,
header,
success: (res) => {
// 请求成功
const { statusCode, data } = res;
// 如果状态码为401需要区分是登录接口还是其他接口
if (statusCode === 401) {
// 如果是登录接口,直接返回数据,让业务层处理
if (url === "/api/user/login" || url === "/api/user/mini-login") {
resolve(data);
return;
}
// 如果是刷新token接口也直接返回让业务层处理
if (url === "/api/user/refresh-token") {
resolve(data);
return;
}
// 如果是获取用户信息接口,返回错误让登录页面处理
if (url === "/api/user/profile") {
reject(new Error("未登录或登录已过期"));
return;
}
// 其他接口的401状态码视为token失效
// 清除存储的token
wx.removeStorageSync("token");
wx.removeStorageSync("userInfo");
// 跳转到登录页
wx.navigateTo({
url: "/pages/login/index",
});
reject(new Error("未登录或登录已过期"));
return;
}
// 其他错误状态码
if (statusCode !== 200) {
// 如果是登录接口,仍然让业务层处理响应数据
if (url === "/api/user/login" || url === "/api/user/mini-login") {
resolve(data);
return;
}
reject(new Error(data.message || `请求失败,状态码:${statusCode}`));
return;
}
// 正常HTTP状态码200但需要检查业务状态码
if (statusCode === 200) {
// 检查业务状态码
if (data && data.code !== 200 && data.code !== 1) {
// 业务错误,创建包含完整错误信息的错误对象
const businessError = new Error(data.msg || '业务错误');
businessError.data = data;
businessError.code = data.code;
reject(businessError);
return;
}
// 业务成功
resolve(data);
return;
}
},
fail: (err) => {
// 请求失败
reject(err);
},
});
});
};
// 导出各种请求方法
module.exports = {
// GET请求 - 支持向后兼容的参数格式
get: (url, arg2 = {}, arg3 = false) => {
// 处理向后兼容:如果第二个参数是布尔值,则说明是旧格式 (url, needAuth)
if (typeof arg2 === 'boolean') {
// 旧格式: get(url, needAuth)
const needAuth = arg2;
return request(url, "GET", {}, needAuth);
} else {
// 新格式: get(url, params, needAuth)
const params = arg2;
const needAuth = arg3 !== false ? arg3 : false;
// 将参数转换为查询字符串
const queryString = Object.keys(params).length > 0
? '?' + Object.keys(params).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&')
: '';
const fullUrl = url + queryString;
return request(fullUrl, "GET", {}, needAuth);
}
},
// POST请求
post: (url, data, needAuth = false) => request(url, "POST", data, needAuth),
// PUT请求
put: (url, data, needAuth = false) => request(url, "PUT", data, needAuth),
// DELETE请求
delete: (url, needAuth = false) => request(url, "DELETE", {}, needAuth),
};