更新记录

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。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。