如何在5分钟内掌握uni-app网络请求?轻量级请求库luch-request实战指南
在uni-app跨平台开发中,网络请求是连接前端与后端的核心桥梁。原生API往往功能基础,难以满足复杂项目需求。luch-request作为一款基于Promise开发的轻量级请求库,专为uni-app打造,提供了拦截器机制、灵活配置和跨平台兼容性,让网络请求管理变得简单高效。本文将通过场景化引导,帮助你快速掌握这款工具的使用方法与最佳实践。
一、核心价值:为什么选择luch-request?
当你需要在uni-app项目中处理复杂的网络请求逻辑时,luch-request能为你带来三大核心优势:
1.1 跨平台一致性
无论是开发小程序、H5还是App,luch-request提供统一的API接口,消除不同平台间的请求差异,让你的代码一次编写,多端运行。
1.2 完善的拦截器机制
支持请求/响应双向拦截,轻松实现Token自动添加、统一错误处理等高级功能,减少重复代码。
1.3 灵活的配置体系
从全局默认配置到单个请求的特殊设置,多层次配置满足不同场景需求,平衡灵活性与开发效率。
二、场景化应用:从零开始的请求实现
步骤1:环境准备与安装
在实际开发中,你可以通过两种方式集成luch-request到项目中:
方式一:npm安装(推荐)
npm install luch-request --save
方式二:源码集成 如果你需要离线使用或深度定制,可以直接复制项目中的核心代码:
test/dev-test/utils/luch-request/
步骤2:初始化请求实例
🔍 基础配置示例:
import Request from 'luch-request'
// 创建请求实例
const http = new Request({
baseURL: 'https://api.example.com', // 基础请求地址
timeout: 8000, // 超时时间(推荐5-10秒)
header: { // 默认请求头
'Content-Type': 'application/json'
}
})
步骤3:发起基础数据请求
💡 电商商品列表请求示例:
// 获取商品列表
http.get('/products', {
params: {
category: 'electronics',
page: 1,
limit: 20
}
})
.then(response => {
console.log('商品数据:', response.data)
// 渲染商品列表
this.productList = response.data.items
})
.catch(error => {
console.error('请求失败:', error)
uni.showToast({ title: '数据加载失败', icon: 'error' })
})
步骤4:处理表单提交
在用户登录场景中,你可以这样发送POST请求:
// 用户登录
http.post('/auth/login', {
username: this.username,
password: this.password
})
.then(res => {
// 存储认证令牌
uni.setStorageSync('token', res.data.token)
uni.navigateTo({ url: '/pages/home/index' })
})
.catch(error => {
if (error.statusCode === 401) {
uni.showToast({ title: '账号或密码错误', icon: 'none' })
}
})
三、进阶技巧:提升请求处理能力
3.1 拦截器的实际应用
请求拦截器:统一添加认证信息
http.interceptors.request.use(config => {
// 从本地存储获取Token
const token = uni.getStorageSync('token')
if (token) {
// 添加Authorization请求头
config.header.Authorization = `Bearer ${token}`
}
return config
})
响应拦截器:统一数据处理与错误捕获
http.interceptors.response.use(
response => {
// 直接返回业务数据层
return response.data.data
},
error => {
// 统一错误处理
switch(error.statusCode) {
case 401:
// Token过期,跳转到登录页
uni.navigateTo({ url: '/pages/login/index' })
break
case 403:
uni.showToast({ title: '没有操作权限', icon: 'none' })
break
case 500:
uni.showToast({ title: '服务器内部错误', icon: 'none' })
break
}
return Promise.reject(error)
}
)
3.2 文件上传功能实现
在电商项目中上传商品图片:
// 上传商品图片
http.upload('/upload/product-image', {
name: 'image',
filePath: tempFilePath,
formData: {
productId: this.productId,
type: 'main'
}
})
.then(res => {
console.log('上传成功:', res.data)
this.productImage = res.data.url
})
.catch(error => {
console.error('上传失败:', error)
})
四、实践案例:构建完整API服务层
4.1 统一API管理
在实际项目中,建议将所有API请求集中管理:
// api/product.js
import http from '../utils/request'
export const productAPI = {
// 获取商品详情
getDetail: (id) => http.get(`/products/${id}`),
// 添加商品到购物车
addToCart: (data) => http.post('/cart', data),
// 更新商品库存
updateStock: (id, stock) => http.patch(`/products/${id}/stock`, { stock }),
// 批量获取商品
batchGet: (ids) => http.post('/products/batch', { ids })
}
// 在页面中使用
import { productAPI } from '@/api/product'
async getProductDetail(id) {
try {
this.product = await productAPI.getDetail(id)
} catch (error) {
console.error('获取商品详情失败', error)
}
}
4.2 并发请求处理
同时获取多个数据资源:
// 同时获取用户信息和订单列表
async loadUserAndOrders() {
try {
const [userInfo, orders] = await Promise.all([
http.get('/user/profile'),
http.get('/orders', { params: { status: 'pending' } })
])
this.user = userInfo
this.orders = orders
this.loading = false
} catch (error) {
console.error('数据加载失败', error)
this.loading = false
}
}
五、常见错误排查
5.1 请求超时问题
问题:网络较差时请求经常超时
解决方案:为不同接口设置差异化超时时间
// 普通接口(默认8秒)
http.get('/api/common')
// 大数据接口(延长至30秒)
http.get('/api/large-data', { timeout: 30000 })
5.2 跨域请求失败
问题:H5端出现跨域错误
解决方案:配置uni-app的devServer代理
// manifest.json
"h5": {
"devServer": {
"proxy": {
"/api": {
"target": "https://api.example.com",
"changeOrigin": true,
"pathRewrite": {
"^/api": ""
}
}
}
}
}
5.3 Token失效处理
问题:Token过期导致请求失败
解决方案:实现Token自动刷新机制
// 在响应拦截器中处理
let isRefreshing = false
let failedQueue = []
http.interceptors.response.use(
response => response,
async error => {
const originalRequest = error.config
// 如果是401错误且不是刷新Token的请求
if (error.statusCode === 401 && !originalRequest._retry) {
if (isRefreshing) {
// 正在刷新Token,将请求加入队列
return new Promise(resolve => {
failedQueue.push({ resolve, originalRequest })
})
}
originalRequest._retry = true
isRefreshing = true
try {
// 刷新Token
const res = await http.post('/auth/refresh-token', {
refreshToken: uni.getStorageSync('refreshToken')
})
// 存储新Token
uni.setStorageSync('token', res.token)
// 重试队列中的请求
failedQueue.forEach(({ resolve, originalRequest }) => {
resolve(http(originalRequest))
})
// 重试当前请求
return http(originalRequest)
} catch (err) {
// 刷新Token失败,需要重新登录
uni.navigateTo({ url: '/pages/login/index' })
return Promise.reject(err)
} finally {
isRefreshing = false
failedQueue = []
}
}
return Promise.reject(error)
}
)
六、性能优化指南
6.1 请求配置优化
- 合理设置超时时间:普通接口5-8秒,大数据接口15-30秒
- 启用请求缓存:对不常变化的数据启用缓存
http.get('/api/categories', {
cache: true, // 启用缓存
cacheTime: 3600000 // 缓存有效期1小时
})
6.2 减少不必要请求
- 数据预取:在页面加载前预取关键数据
- 防抖处理:对搜索框等频繁触发请求的场景添加防抖
import { debounce } from '@/utils/helper'
// 防抖处理搜索请求
this.searchProducts = debounce(async (keyword) => {
this.results = await http.get('/api/search', { params: { keyword } })
}, 500) // 500毫秒防抖
6.3 批量请求优化
- 使用Promise.all并发请求而非串行请求
- 对大量请求进行分组,避免同时发起过多请求
七、学习资源与源码指引
核心源码路径
- 请求核心逻辑:src/lib/core/Request.js
- 拦截器实现:src/lib/core/InterceptorManager.js
- 默认配置:src/lib/core/defaults.js
官方文档
通过本文的介绍,你已经掌握了luch-request的核心用法和最佳实践。这款轻量级请求库将帮助你在uni-app项目中更高效地处理网络请求,提升开发效率和用户体验。开始动手实践,探索更多高级功能吧!
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0193- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
awesome-zig一个关于 Zig 优秀库及资源的协作列表。Makefile00