更新记录
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 |
- |
获取任务对象 |