更新记录
2.0.0(2025-10-28) 下载此版本
2.0.0(2025-10-28)
✨ 新增功能
请求缓存
- 新增请求缓存管理器
CacheManager - 支持GET请求结果智能缓存
- 可配置缓存有效期 (TTL)
- 支持缓存白名单/黑名单
- 提供缓存统计和管理API
请求队列与并发控制
- 新增请求队列管理器
QueueManager - 支持控制最大并发请求数
- 支持请求优先级设置
- 提供队列状态查询API
性能监控
- 新增性能监控器
PerformanceMonitor - 实时记录请求耗时
- 提供详细的性能统计数据
- 支持导出性能日志
日志系统
- 新增日志记录器
Logger - 支持多级别日志 (debug, info, warn, error)
- 完整的请求/响应日志记录
- 支持导出日志为JSON格式
上传下载
- 新增
upload()方法支持文件上传 - 新增
download()方法支持文件下载 - 支持上传/下载进度监听
- 上传下载均支持取消操作
Mock数据支持
- 新增Mock模式,方便开发调试
- 支持静态Mock数据
- 支持动态Mock函数
- 可配置Mock响应延迟
指数退避重试
- 新增指数退避重试策略
- 避免请求风暴,更智能的重试机制
- 可配置基础延迟和最大延迟
- 自动添加随机抖动
调试模式
- 新增
debug配置项 - 详细的请求过程日志输出
- 便于开发时问题排查
1.0.0(2025-09-22) 下载此版本
## [1.0.0] - 2025-09-21
### Added
- 初次发布。
- 实现核心请求功能,支持GET、POST、PUT、DELETE等方法。
- 实现自动Token管理。
- 实现请求防重机制。
- 实现请求重试机制。
- 实现错误统一处理与提示。
- 实现请求/响应拦截器。
- 实现请求取消功能。
- 提供完整的TypeScript类型定义。
- 提供丰富的配置选项。
平台兼容性
uni-app(3.6.12)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - |
uni-app x(3.6.12)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
hy-request-plus 增强型网络请求封装
一个功能强大、配置灵活的 uni-app 网络请求封装库。
✨ 特性
核心功能
- 🔄 多端兼容: 支持 App、H5、各大小程序平台
- 🔐 自动Token管理: 自动在请求头中添加认证令牌
- ⚡ 请求防重: 防止短时间内重复提交相同请求
- 🔁 智能重试: 支持失败请求自动重试,可选指数退避策略
- 🛡️ 错误统一处理: 自动处理常见错误并友好提示
- ✋ 请求取消: 支持取消进行中的请求
- 🔌 拦截器: 提供请求和响应拦截器
v2.0 新增功能
- 💾 请求缓存: 智能缓存GET请求结果,提升性能
- 🎯 请求队列: 控制并发请求数,优化资源利用
- 📊 性能监控: 实时监控请求性能指标
- 📝 日志记录: 完整的请求日志追踪
- 📤 上传下载: 支持文件上传下载及进度监听
- 🎭 Mock支持: 内置Mock数据支持,方便开发调试
- 🔧 调试模式: 详细的调试信息输出
- 🎯 请求优先级: 支持设置请求优先级
技术特性
- 🎯 TypeScript支持: 完整的类型定义
- 📦 零依赖: 不依赖第三方库
- 🔒 无权限依赖: 纯JS封装,不涉及任何系统权限
🚀 快速开始
基本使用
// 导入请求库
import request from '@/uni_modules/hy-request-plus/js_sdk/hy-request-plus/index.esm.js';
// 发起GET请求
const response = await request.get('/api/user/info', { id: 123 });
console.log(response.data);
// 发起POST请求
const response = await request.post('/api/user/login', {
username: 'admin',
password: 'password'
});
console.log(response.data);
创建请求实例
import { Request } from '@/uni_modules/hy-request-plus/js_sdk/hy-request-plus/index.esm.js';
// 创建自定义配置的实例
const apiClient = Request.create({
baseURL: 'https://api.example.com',
timeout: 10000,
withToken: true,
enableCache: true,
enableLogger: true
});
// 使用实例
const response = await apiClient.get('/user/info');
📖 详细文档
全局配置
import request from '@/uni_modules/hy-request-plus/js_sdk/hy-request-plus/index.esm.js';
// 基础配置
request.defaults.baseURL = 'https://api.example.com';
request.defaults.timeout = 15000;
request.defaults.withToken = true;
// 启用缓存
request.defaults.enableCache = true;
request.defaults.cacheTTL = 300000; // 5分钟
// 启用请求队列
request.defaults.enableQueue = true;
request.defaults.maxConcurrent = 6;
// 启用性能监控
request.defaults.enablePerformanceMonitor = true;
// 启用日志
request.defaults.enableLogger = true;
request.defaults.logLevel = 'info';
// 启用调试模式
request.defaults.debug = true;
// 启用指数退避重试
request.defaults.useExponentialBackoff = true;
// 设置Token获取方式
request.defaults.getToken = () => {
return uni.getStorageSync('ACCESS_TOKEN');
};
// 自定义错误处理
request.defaults.errorHandler = (error) => {
console.error('请求错误:', error);
if (error.statusCode === 401) {
uni.navigateTo({ url: '/pages/login/login' });
}
};
使用拦截器
// 添加请求拦截器
request.interceptors.request.use(
(config) => {
// 在发送请求前做些什么
console.log('请求拦截:', config);
config.headers['X-Custom-Header'] = 'custom-value';
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 添加响应拦截器
request.interceptors.response.use(
(response) => {
// 处理业务逻辑
if (response.data && response.data.code !== 0) {
return Promise.reject(response.data);
}
return response;
},
(error) => {
console.error('响应错误:', error);
return Promise.reject(error);
}
);
请求缓存
// 启用缓存的GET请求
const response = await request.get('/api/user/info',
{ id: 123 },
{
enableCache: true,
cacheTTL: 60000 // 缓存1分钟
}
);
// 清空所有缓存
request.clearCache();
// 删除指定缓存
request.deleteCache('/api/user/info', { id: 123 });
// 获取缓存统计
const stats = request.getCacheStats();
console.log('缓存数量:', stats.size);
请求队列与并发控制
// 启用请求队列
request.defaults.enableQueue = true;
request.defaults.maxConcurrent = 3; // 最多3个并发请求
// 设置请求优先级 (0-10, 数字越大优先级越高)
const response = await request.get('/api/important', {}, {
requestPriority: 10
});
// 动态调整并发数
request.setMaxConcurrent(6);
// 获取队列状态
const status = request.getQueueStatus();
console.log('运行中:', status.running);
console.log('等待中:', status.waiting);
上传文件
// 选择文件
uni.chooseImage({
count: 1,
success: async (res) => {
const filePath = res.tempFilePaths[0];
// 上传文件
const response = await request.upload('/api/upload', filePath, {
name: 'file',
formData: {
user_id: 123
},
onUploadProgress: (e) => {
const percent = (e.progress * 100).toFixed(2);
console.log('上传进度:', percent + '%');
}
});
console.log('上传成功:', response.data);
}
});
下载文件
const response = await request.download('/api/file/download', {
onDownloadProgress: (e) => {
const percent = (e.progress * 100).toFixed(2);
console.log('下载进度:', percent + '%');
}
});
console.log('下载路径:', response.tempFilePath);
Mock数据
// 启用Mock
const response = await request.get('/api/user/info', {}, {
enableMock: true,
mockDelay: 500,
mockData: {
code: 0,
data: {
id: 1,
name: '张三',
email: 'zhangsan@example.com'
}
}
});
// 使用函数返回Mock数据
const response = await request.post('/api/login', {}, {
enableMock: true,
mockData: (config) => {
return {
code: 0,
data: {
token: 'mock-token-' + Date.now(),
user: config.data
}
};
}
});
性能监控
// 启用性能监控
request.defaults.enablePerformanceMonitor = true;
// 发送请求...
await request.get('/api/data');
await request.post('/api/submit', {});
// 获取性能统计
const stats = request.getPerformanceStats();
console.log('总请求数:', stats.total);
console.log('平均耗时:', stats.avgDuration + 'ms');
console.log('最大耗时:', stats.maxDuration + 'ms');
// 导出性能日志
const logs = request.exportPerformanceLogs();
console.log(logs);
日志记录
// 启用日志
request.defaults.enableLogger = true;
request.defaults.logLevel = 'debug'; // debug, info, warn, error
// 发送请求会自动记录日志
await request.get('/api/data');
// 获取所有日志
const logs = request.getRequestLogs();
console.log(logs);
// 导出日志(JSON格式)
const jsonLogs = request.exportRequestLogs();
console.log(jsonLogs);
// 清空日志
request.clearLogs();
取消请求
import { CancelToken, isCancel } from '@/uni_modules/hy-request-plus/js_sdk/hy-request-plus/index.esm.js';
// 创建取消令牌
const source = CancelToken.source();
// 发起可取消的请求
request.get('/api/some-data', {}, {
cancelToken: source.token
}).catch(error => {
if (isCancel(error)) {
console.log('请求被取消:', error.message);
}
});
// 取消请求
source.cancel('用户取消了操作');
// 取消所有进行中的请求
request.cancelAllRequests('页面跳转,取消所有请求');
// 根据URL模式取消请求
request.cancelRequestsByUrl('/api/temp', '不再需要此数据');
指数退避重试
// 启用指数退避重试策略
const response = await request.get('/api/unstable', {}, {
retryCount: 3,
useExponentialBackoff: true,
backoffBaseDelay: 1000, // 基础延迟1秒
backoffMaxDelay: 30000 // 最大延迟30秒
});
// 重试延迟: 第1次 ~1s, 第2次 ~2s, 第3次 ~4s
📋 完整配置选项
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 基础配置 | |||
| baseURL | String | '' | 请求的基础地址 |
| timeout | Number | 60000 | 请求超时时间(ms) |
| headers | Object | {...} | 请求头 |
| Token配置 | |||
| withToken | Boolean | true | 是否自动携带Token |
| tokenHeaderName | String | 'Authorization' | Token头部字段名 |
| tokenPrefix | String | 'Bearer ' | Token前缀 |
| getToken | Function | () => storage.token | 获取Token的函数 |
| setToken | Function | null | 设置Token的函数 |
| 防重与重试 | |||
| enableAntiShake | Boolean | true | 是否开启请求防重 |
| antiShakeDelay | Number | 500 | 防重等待时间(ms) |
| retryCount | Number | 2 | 请求重试次数 |
| retryDelay | Number | 1000 | 请求重试间隔(ms) |
| retryStatusCodes | Array | [500,502,503,504] | 需要重试的状态码 |
| retryOnTimeout | Boolean | true | 是否对超时错误重试 |
| useExponentialBackoff | Boolean | false | 使用指数退避重试策略 |
| backoffBaseDelay | Number | 1000 | 退避基础延迟(ms) |
| backoffMaxDelay | Number | 30000 | 退避最大延迟(ms) |
| UI提示 | |||
| showLoading | Boolean | false | 是否显示Loading提示 |
| loadingText | String | '加载中...' | Loading提示文本 |
| loadingMask | Boolean | true | Loading是否显示遮罩 |
| autoHandleError | Boolean | true | 是否自动处理错误 |
| errorDuration | Number | 3000 | 错误提示持续时间(ms) |
| 缓存配置 | |||
| enableCache | Boolean | false | 是否启用请求缓存 |
| cacheTTL | Number | 300000 | 缓存有效期(ms, 5分钟) |
| cacheWhiteList | Array | [] | 缓存白名单URL模式 |
| cacheBlackList | Array | [] | 缓存黑名单URL模式 |
| 队列配置 | |||
| enableQueue | Boolean | false | 是否启用请求队列 |
| maxConcurrent | Number | 6 | 最大并发请求数 |
| requestPriority | Number | 0 | 默认请求优先级(0-10) |
| 监控与日志 | |||
| enablePerformanceMonitor | Boolean | false | 是否启用性能监控 |
| enableLogger | Boolean | false | 是否启用日志 |
| logLevel | String | 'info' | 日志级别 |
| debug | Boolean | false | 是否启用调试模式 |
| Mock配置 | |||
| enableMock | Boolean | false | 是否启用Mock |
| mockDelay | Number | 500 | Mock响应延迟(ms) |
| mockData | Any/Function | null | Mock数据或函数 |
| 进度回调 | |||
| onUploadProgress | Function | null | 上传进度回调 |
| onDownloadProgress | Function | null | 下载进度回调 |
| 高级配置 | |||
| validateStatus | Function | status => status<300 | 成功状态码校验 |
| transformResponse | Function | JSON.parse | 响应数据转换 |
| paramsSerializer | Function | 默认序列化 | 参数序列化函数 |
| errorHandler | Function | null | 自定义错误处理函数 |
🎯 最佳实践
1. 创建API模块
// api/request.js
import { Request } from '@/uni_modules/hy-request-plus/js_sdk/hy-request-plus/index.esm.js';
const request = Request.create({
baseURL: 'https://api.example.com',
timeout: 10000,
enableCache: true,
enableLogger: process.env.NODE_ENV === 'development',
debug: process.env.NODE_ENV === 'development'
});
// 请求拦截器
request.interceptors.request.use(config => {
const token = uni.getStorageSync('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 响应拦截器
request.interceptors.response.use(
response => {
if (response.data.code !== 0) {
uni.showToast({
title: response.data.message,
icon: 'none'
});
return Promise.reject(response.data);
}
return response.data;
},
error => {
if (error.statusCode === 401) {
uni.reLaunch({ url: '/pages/login/login' });
}
return Promise.reject(error);
}
);
export default request;
2. 封装API接口
// api/user.js
import request from './request.js';
export const userApi = {
// 获取用户信息(使用缓存)
getUserInfo(id) {
return request.get('/user/info', { id }, {
enableCache: true,
cacheTTL: 60000
});
},
// 登录
login(data) {
return request.post('/user/login', data);
},
// 上传头像
uploadAvatar(filePath) {
return request.upload('/user/avatar', filePath, {
name: 'avatar',
onUploadProgress: (e) => {
console.log('上传进度:', e.progress);
}
});
}
};
3. 在页面中使用
<script>
import { userApi } from '@/api/user.js';
export default {
data() {
return {
userInfo: null
};
},
async onLoad() {
try {
const data = await userApi.getUserInfo(123);
this.userInfo = data;
} catch (error) {
console.error('获取用户信息失败:', error);
}
}
};
</script>
📝 更新日志
查看 CHANGELOG
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📄 许可证
MIT License
💡 技术支持
如有问题,欢迎在插件市场评论区留言或提交 Issue。

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(1)
下载 37
赞赏 0
下载 10794679
赞赏 1798
赞赏
京公网安备:11010802035340号