Files
nxxmdata/government-mini-program/utils/request.js
2025-10-17 17:29:11 +08:00

225 lines
4.6 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.

const apiConfig = require('../config/api.js');
/**
* 封装的HTTP请求工具
*/
class Request {
constructor() {
this.baseURL = apiConfig.baseURL;
this.timeout = apiConfig.timeout;
}
/**
* 发送HTTP请求
* @param {Object} options 请求配置
* @returns {Promise} 请求结果
*/
request(options) {
return new Promise((resolve, reject) => {
// 获取存储的token
const token = wx.getStorageSync('token');
// 构建请求头
const header = {
'Content-Type': 'application/json',
...options.header
};
// 如果有token添加到请求头
if (token) {
header['Authorization'] = `Bearer ${token}`;
}
// 构建完整URL
const url = options.url.startsWith('http')
? options.url
: `${this.baseURL}${options.url}`;
// 发送请求
wx.request({
url,
method: options.method || 'GET',
data: options.data || {},
header,
timeout: this.timeout,
success: (res) => {
console.log('API请求成功:', url, res);
// 处理HTTP状态码
if (res.statusCode >= 200 && res.statusCode < 300) {
// 处理业务状态码
if (res.data && res.data.code !== undefined) {
if (res.data.code === 200 || res.data.code === 0) {
resolve(res.data);
} else {
// 业务错误
this.handleBusinessError(res.data);
reject(res.data);
}
} else {
// 没有业务状态码,直接返回数据
resolve(res.data);
}
} else {
// HTTP错误
this.handleHttpError(res);
reject(res);
}
},
fail: (err) => {
console.error('API请求失败:', url, err);
this.handleNetworkError(err);
reject(err);
}
});
});
}
/**
* GET请求
*/
get(url, data = {}, options = {}) {
return this.request({
url,
method: 'GET',
data,
...options
});
}
/**
* POST请求
*/
post(url, data = {}, options = {}) {
return this.request({
url,
method: 'POST',
data,
...options
});
}
/**
* PUT请求
*/
put(url, data = {}, options = {}) {
return this.request({
url,
method: 'PUT',
data,
...options
});
}
/**
* DELETE请求
*/
delete(url, data = {}, options = {}) {
return this.request({
url,
method: 'DELETE',
data,
...options
});
}
/**
* 处理业务错误
*/
handleBusinessError(data) {
const message = data.message || '请求失败';
// 特殊错误码处理
switch (data.code) {
case 401:
// 未授权清除token并跳转登录
wx.removeStorageSync('token');
wx.removeStorageSync('userInfo');
wx.showToast({
title: '登录已过期,请重新登录',
icon: 'none'
});
setTimeout(() => {
wx.reLaunch({
url: '/pages/login/login'
});
}, 1500);
break;
case 403:
wx.showToast({
title: '权限不足',
icon: 'none'
});
break;
default:
wx.showToast({
title: message,
icon: 'none'
});
}
}
/**
* 处理HTTP错误
*/
handleHttpError(res) {
let message = '网络请求失败';
switch (res.statusCode) {
case 400:
message = '请求参数错误';
break;
case 401:
message = '未授权访问';
break;
case 403:
message = '禁止访问';
break;
case 404:
message = '请求地址不存在';
break;
case 500:
message = '服务器内部错误';
break;
case 502:
message = '网关错误';
break;
case 503:
message = '服务不可用';
break;
case 504:
message = '网关超时';
break;
}
wx.showToast({
title: message,
icon: 'none'
});
}
/**
* 处理网络错误
*/
handleNetworkError(err) {
let message = '网络连接失败';
if (err.errMsg) {
if (err.errMsg.includes('timeout')) {
message = '请求超时';
} else if (err.errMsg.includes('fail')) {
message = '网络连接失败';
}
}
wx.showToast({
title: message,
icon: 'none'
});
}
}
// 创建实例
const request = new Request();
module.exports = request;