uni-request 重磅发布:三端统一网络请求新标准

106 阅读3分钟

v0.1.0 为首个可用版本:以 uni.request 为唯一底层依赖、不重造网络栈,把 URL 拼接、header 合并、超时取消、错误收敛这些每次都要重写的重复劳动收进一套 axios 心智的 API。Web / 微信小程序 / Android 三端编译验证通过,Web 端 15 项真实网络测试矩阵全部通过。

一、为什么做这个库

直接用 uni.request 写业务,三件事反复发生:

  • 重复封装:URL 与 query 拼接、header 合并、超时与取消、失败形态归一——每个项目封装一遍,换个项目再来一遍
  • 多端差异:编码行为、失败返回在各端存在差异,逐端排查成本高
  • 类型缺位:uni.request 泛回调风格,错误码散落字符串,业务侧只能 as any

unix-request 把这些收敛成一套库:写过 axios 的开发者看一眼 API 就能上手;多端发布由库内确定性实现抹平差异;全链路强类型标注。

二、核心能力

请求主入口 + 七种快捷方法

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

// 泛型静态标注 res.data 类型
request<UTSJSONObject>({ url: '/api/http/method/get', method: 'GET' })

// 快捷方法:method 由方法名固定注入(delete 为 UTS 保留字,命名 del)
get<UTSJSONObject>('/users', { params: { page: 1 } as UTSJSONObject })
post<UTSJSONObject>('/login', { user: 'demo' } as UTSJSONObject, null)

默认实例开箱即用,configureRequest 配置全局默认;createRequest(defaults) 创建隔离实例(defaults 与拦截器注册表互不影响),心智对标 axios.create。

拦截器

请求 / 响应拦截器多枚有序注册、可 ejectInterceptor(id) 移除;响应错误链支持三条路径——恢复(返回响应)/ 换错(返回新错误)/ 放行(返回 null),语义对标 axios。

统一可预测的错误结构

RequestError 收敛 8 类错误码(ERR_PARAM / ERR_CONFIG / ERR_CANCELED / ERR_TIMEOUT / ERR_NETWORK / ERR_BAD_REQUEST / ERR_BAD_RESPONSE / ERR_NATIVE),原生 errCode 经 nativeErrCode 原值透传不翻译,config 与 response 原文挂载——4xx/5xx 响应体不丢失。

确定性 URL 与参数处理

baseURL 自动拼接(http(s) 开头原样使用)、params 与 url 既有 query 合并后由库内统一编码(encodeURIComponent + JSON 序列化兜底)、GET/HEAD 的 UTSJSONObject 请求体自动并入 query、header 三级浅合并(内置默认 → 实例默认 → 请求级)。

请求取消

import { createCancelSource } from '@/uni_modules/ux-request'

const source = createCancelSource()
request<UTSJSONObject>({ url: '/heavy', cancelToken: source.token })
// 离开页面时:
source.cancel('page unloaded') // 确定性 abort,请求以 ERR_CANCELED reject

逃生舱

onTask 透出原生 RequestTask(chunked 分块监听等高级场景);enableQuic / sslVerify / withCredentials / enableChunked 等原生能力参数全量透传不抹平。

三、平台支持现状

平台状态
Web✅ 编译产物验证,15 项真实网络测试矩阵全部通过
微信小程序✅ 产物验证通过;15 项矩阵待开发者工具人工实测
Android✅ 云打包 release 编译零错误;真机矩阵待真机验证
iOS / 鸿蒙⏳ 代码已适配,受环境限制暂未实测(iOS 需 macOS、鸿蒙需 DevEco Studio)

四、快速上手

pnpm add @meng-xi/unix-request
mkdir -p uni_modules && cp -R node_modules/@meng-xi/unix-request uni_modules/ux-request
import { request, configureRequest } from '@/uni_modules/ux-request'
import type { RequestError } from '@/uni_modules/ux-request'

configureRequest({
	baseURL: 'https://your.api',
	timeout: 10000,
	header: null,
	validateStatus: null // null 表示沿用内置默认(2xx)
})

request<UTSJSONObject>({ url: '/api/http/method/get' }).then((res) => {
	console.log('statusCode=' + res.statusCode.toString())
}).catch((err) => {
	const e = err as RequestError
	console.log(e.code, e.errMsg)
})

不想搭工程?安卓真机可直接下载体验 App:下载体验 App(APK)——上述示例工程的云打包产物,安装后即可在真机运行全部用例。

五、文档与资源

六、交流与关注

想了解设计思路与实现原理(UTS 泛型跨端、错误体系收敛、取消的确定性 abort 等)?公众号「梦曦工作室」有系列解析,扫码关注:

相关链接

欢迎反馈与共建:GitHub