更新记录

1.0.0(2026-07-14) 下载此版本

新增

  • 一行代码搞定所有请求需求:GET/POST/上传/下载,一个实例全搞定
  • 拦截器支持异步,让 Token 注入、日志记录等操作更灵活
  • 智能 Loading:多请求自动叠加/隐藏,再也不用担心 Loading 闪烁
  • 开箱即用的错误处理:HTTP 状态码映射,告别繁琐的 try-catch
  • 静默错误码:特定业务场景可静默处理,体验更丝滑
  • 插件化扩展:通过插件轻松集成 Token 管理、埋点上报等通用能力
  • 统一响应结构:code 判断成功/失败,Toast 提示自动处理
  • TypeScript 优先:完整的类型提示,编码更安心
  • 自动 baseURL 拼接:相对路径自动补全,配置更简洁
  • 任务对象回调:随时取消请求、监听上传下载进度

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

uni-app x(3.8.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

mh-request

基于 uni-app 的网络请求封装,开箱即用,一站式解决所有请求需求。

特性

  • 🚀 一行代码搞定所有请求:GET/POST/上传/下载
  • ⚡ 拦截器支持异步:Token 注入、日志记录轻松搞定
  • 🎯 智能 Loading:多请求自动叠加/隐藏,体验丝滑
  • 🛡️ 开箱即用的错误处理:HTTP 状态码映射 + 静默码
  • 🔌 插件化架构:Token 插件、埋点插件等直接复用
  • 📦 统一响应结构:code 判断成功/失败,Toast 自动提示
  • 💎 极简零依赖:只依赖 uni-app 原生 API,无额外包体积负担
  • 🔧 稳定可靠:拦截器执行失败不会阻断请求
  • 🚫 零污染:不使用 uni.addInterceptor 全局拦截,每个实例独立,不影响全局

快速开始

创建请求实例

import { Request } from '@/uni_modules/mh-request/js_sdk'

// 默认实例
const request = new Request({
  baseURL: 'https://api.example.com',
  successCode: 1,
  silentCodes: [409]
})

export default request

多实例配置

import { Request } from '@/uni_modules/mh-request/js_sdk'

// 用户相关接口(带 Token)
const userRequest = new Request({
  baseURL: 'https://api.example.com',
  successCode: 1,
  plugins: [{ plugin: tokenPlugin }]
})

// 公开接口(无需 Token)
const publicRequest = new Request({
  baseURL: 'https://public.example.com',
  successCode: 0
})

export { userRequest, publicRequest }

发送请求

// GET 请求
const res = await request.get('/user/info')
console.log(res.data)

// POST 请求
const res = await request.post('/user/login', { username: 'admin', password: '123456' })

// 完整配置
const res = await request.request({
  url: '/user/info',
  method: 'GET',
  data: { id: 1 },
  showLoading: true,
  showSuccessMessage: true
})

文件上传

const res = await request.upload({
  url: '/upload',
  filePath: tempFilePath,
  name: 'file',
  formData: { type: 'image' }
})

文件下载

const res = await request.download({ url: 'https://example.com/file.pdf' })
console.log(res.tempFilePath)

请求拦截器

request.useRequest(async (options) => {
  const token = uni.getStorageSync('token')
  if (token) {
    options.header = { ...options.header, Authorization: `Bearer ${token}` }
  }
})

响应拦截器

request.useResponse(async (res, options, data) => {
  if (data?.code === 401) {
    uni.removeStorageSync('token')
    uni.reLaunch({ url: '/pages/login/index' })
  }
})

取消请求

let task
request.get('/user/info', { onTask: (t) => (task = t) })
task?.abort()

插件扩展

// 插件函数,第二个参数为插件专属配置(不传则接收完整 Config)
const myPlugin = (request, config) => {
  request.useRequest((options) => {
    console.log('请求:', options.url, config) // config 为插件专属配置或完整配置
  })
  request.useResponse((res, options, data) => {
    console.log('响应:', data)
  })
}

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    { plugin: myPlugin }, // 使用完整配置
    { plugin: myPlugin, config: { timeout: 5000 } } // 使用插件专属配置
  ]
})

配置说明

构造配置

属性 类型 默认值 说明
baseURL string '' 请求基础 URL
successCode number 1 业务成功状态码
silentCodes number[] [409] 静默错误码
httpSuccessCodes number[] [200] HTTP 成功状态码
plugins PluginItem[] [] 插件列表

请求配置

属性 类型 默认值 说明
showLoading boolean false 显示 Loading
showSuccessMessage boolean false 显示成功提示
showCodeMessage boolean true 显示业务错误提示
showErrorMessage boolean true 显示 HTTP 错误提示
onTask function - 获取任务对象

隐私、权限声明

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

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

插件不采集任何数据

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

许可协议

MIT协议

暂无用户评论。