更新记录

1.0.0(2026-10-08) 下载此版本

  • 首个版本,实现组件基础能力,支持 Vue2 / Vue3、全平台(App / H5 / 各家小程序)。

平台兼容性

uni-app(3.8.5)

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

e-request 统一请求封装

基于 uni.request 的统一网络请求封装,提供拦截器、token 自动注入、统一错误处理、loading 控制、失败重试等能力。

特性

  • 全局配置一次 baseURL / 超时 / 公共 header
  • 请求与响应双拦截器,统一注入 token、统一解包业务数据
  • 自动 loading 管理(带计数,并发请求不会误关)
  • 失败自动重试,处理网络抖动
  • 请求取消,解决页面快速切换的竞态
  • 自动解包业务 data 字段,减少调用侧样板代码

引入

import { setConfig, get, post, addRequestInterceptor } from '@/uni_modules/e-request'

快速开始

1. 全局配置(在 main.js 或 App.vue 的 onLaunch 中执行一次)

import { setConfig } from '@/uni_modules/e-request'

setConfig({
  baseURL: 'https://api.example.com',
  timeout: 15000,
  header: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

2. 注入 token

import { addRequestInterceptor } from '@/uni_modules/e-request'

addRequestInterceptor((options) => {
  const token = uni.getStorageSync('token')
  if (token) {
    options.header = options.header || {}
    options.header.Authorization = `Bearer ${token}`
  }
  return options   // 必须返回 options 才能生效
})

3. 发起请求

import { get, post } from '@/uni_modules/e-request'

// GET,自动返回 data 字段内容
const list = await get('/user/list', { page: 1, size: 20 })

// POST + 自动 loading
const result = await post('/order/create', payload, {
  loading: true,
  loadingText: '提交中...'
})

配置项(setConfig / 单次请求)

配置名 类型 默认值 说明
baseURL String '' 基础地址,会自动与相对路径拼接
timeout Number 30000 超时时间(毫秒)
header Object {} 公共请求头
method String GET 请求方法
loading Boolean false 是否显示 loading
loadingText String 加载中... loading 文案
retry Number 0 失败自动重试次数
retryDelay Number 500 重试间隔(毫秒)
codeKey String code 业务成功码字段名
successCode Array | null [0, 200, '0', '200'] 业务成功码取值,设为 null 跳过校验
dataKey String data 业务数据字段名
returnRaw Boolean false 是否返回完整响应体而非解包后的 data
needToken Boolean true 是否注入 token(供拦截器判断)
onError Function — 单次请求的自定义错误处理
cancelRepeat Boolean false 是否取消重复的相同请求

快捷方法

方法 说明
get(url, data, options) GET 请求
post(url, data, options) POST 请求
put(url, data, options) PUT 请求
del(url, data, options) DELETE 请求
request(options) 通用请求,需在 options 中指定 url

工具方法

方法 说明
setConfig(config) 设置全局配置
getConfig() 读取当前全局配置(只读副本)
addRequestInterceptor(fn) 添加请求拦截器
addResponseInterceptor(fn) 添加响应拦截器
cancel(options) 取消指定请求
cancelAll() 取消全部进行中的请求
all(tasks) 并发请求,全部成功才 resolve
allSettled(tasks) 并发请求,返回每项成功/失败状态

拦截器用法

请求拦截器

addRequestInterceptor((options) => {
  // 返回修改后的 options 生效
  options.header['X-App-Version'] = '1.0.0'

  // 返回 false 可中断本次请求
  if (!uni.getStorageSync('token')) {
    uni.navigateTo({ url: '/pages/login/login' })
    return false
  }

  return options
})

响应拦截器

addResponseInterceptor((res, options) => {
  const body = res.data

  // 登录失效统一处理
  if (body && body.code === 401) {
    uni.removeStorageSync('token')
    uni.navigateTo({ url: '/pages/login/login' })
  }

  // 返回 undefined 表示不改动,继续走默认解包逻辑
  // 返回其他值会替换 response 对象
  return undefined
})

错误对象结构

请求失败时 catch 到的错误对象:

字段 说明
type 错误类型:http / business / network
statusCode HTTP 状态码(http 类型)
code 业务错误码(business 类型)
message 错误描述
data 原始响应数据
try {
  await get('/user/info')
} catch (err) {
  if (err.type === 'network') {
    console.log('网络问题')
  } else if (err.type === 'business' && err.code === 401) {
    console.log('需要重新登录')
  }
}

高级用法

失败自动重试

适合弱网环境下的轮询类接口:

await get('/device/status', { id: 'A01' }, {
  retry: 3,
  retryDelay: 800
})

并发请求

const [stats, notices, todos] = await Promise.all([
  get('/dashboard/stats'),
  get('/dashboard/notices'),
  get('/dashboard/todos')
])

静默失败(不弹默认 toast)

await get('/user/check', {}, {
  onError: (err) => {
    console.warn('静默处理:', err)
  }
})

全局关闭错误提示

setConfig({ showErrorToast: false })

实现说明

为什么不用 axios?

小程序端没有 XMLHttpRequest,axios 需要额外适配器且体积较大。直接封装 uni.request 能获得最小包体积与最好的多端一致性。

loading 为什么要计数?

如果两个请求同时发起、各自调用 showLoading / hideLoading,先完成的那个会提前关掉 loading,用户看到的加载态就断了。组件内部用 loadingCount 计数,只有计数归零时才真正隐藏。

请求拦截器必须返回 options

拦截器函数的返回值决定后续行为:

  • 返回修改后的 options → 生效
  • 返回 false → 中断请求(Promise.reject)
  • 返回 undefined → 保持原 options 不变

successCode 设为 null 的场景

如果后端返回的是裸数据(没有 code / msg 包装),把 successCode 设为 null 可跳过业务层校验,直接返回响应体。

平台兼容

App (vue / nvue)、H5、全平台小程序均支持。

隐私与权限

本插件仅在开发者配置的服务器地址内收发请求,自身不采集、不上传任何数据。网络请求权限由宿主应用统一申请。

隐私、权限声明

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

无

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

仅在开发者配置的服务器地址内收发请求,本插件自身不采集、不上传任何数据。

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

无

许可协议

MIT协议

暂无用户评论。