uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互
全篇大概 3600 字(含代码),建议阅读时间 25min
📚 目录
- 使用uni.request发起请求
- 封装全局请求工具
- 破解跨域难题
- 总结
在跨平台应用开发中,网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求,但在实际项目中,我们还需要处理全局封装、错误处理和跨域等实际问题。本文将带您全面掌握 UniApp 网络请求的实战技巧。
1、使用 uni.request 发起请求
1.1 基本用法
uni.request 是 UniApp 的核心 API,支持所有主流平台。
基础用法如下:
// 发起 GET 请求
uni.request({url: '接口',method: 'GET',success: (res) => {console.log('响应数据:', res.data);},fail: (err) => {console.error('请求失败:', err);}
});
// 发起 POST 请求
uni.request({url: '接口',method: 'POST',data: { name: 'John', age: 25 },header: { 'Content-Type': 'application/json' },success: (res) => {console.log('提交成功:', res.data);}
});
1.2 实战示例:获取天气数据
function getWeather(city) {uni.request({url: '接口',data: { city: city },success: (res) => {if (res.statusCode === 200) {console.log('当前温度:', res.data.temperature);} else {uni.showToast({ title: '数据获取失败', icon: 'none' });}},fail: () => {uni.showToast({ title: '网络连接失败', icon: 'none' });}});
}
2. 封装全局请求工具
2.1 为什么要封装?
- 统一处理
错误和加载状态 - 集中管理
请求头(如 Token) 简化业务代码调用
2.2 完整封装方案
创建 utils/http.js:
class HttpRequest {constructor() {this.baseUrl = '接口';this.timeout = 10000;}request(config) {return new Promise((resolve, reject) => {// 请求拦截const fullUrl = this.baseUrl + config.url;const header = this.getHeaders(config.headers);uni.request({url: fullUrl,method: config.method || 'GET',data: config.data,header: header,timeout: this.timeout,success: (res) => {// 响应拦截if (res.statusCode === 200) {resolve(res.data);} else {this.handleError(res);reject(res);}},fail: (err) => {this.handleError(err);reject(err);}});});}getHeaders(customHeaders) {const headers = {'Content-Type': 'application/json','X-Client-Type': 'uniapp'};// 添加认证 Tokenconst token = uni.getStorageSync('authToken');if (token) headers.Authorization = `Bearer ${token}`;return { ...headers, ...customHeaders };}handleError(error) {const status = error.statusCode;let message = '请求失败';if (status === 401) {message = '登录已过期';uni.navigateTo({ url: '/pages/login/login' });} else if (status >= 500) {message = '服务器异常,请稍后再试';}uni.showToast({ title: message, icon: 'none' });}get(url, params) {return this.request({ method: 'GET', url, data: params });}post(url, data) {return this.request({ method: 'POST', url, data });}
}export default new HttpRequest();
2.3 使用示例
import http from '@/utils/http';// 获取用户信息
async function fetchUser() {try {const user = await http.get('/user/profile');console.log('用户数据:', user);} catch (e) {console.error('请求异常:', e);}
}// 提交表单
async function submitForm(data) {await http.post('/form/submit', data);uni.showToast({ title: '提交成功' });
}
3. 破解跨域难题
3.1 跨域原理
浏览器安全策略限制不同源(协议+域名+端口)的请求,主要影响H5端,小程序/App端无此限制。
3.2 解决方案对比
| 方案 | 适用环境 | 优点 | 缺点 |
|---|---|---|---|
| 开发代理 | 本地开发 | 无需后端配合 | 仅限开发环境 |
| CORS | 生产环境 | 标准解决方案 | 需要后端配置 |
| JSONP | 简单请求 | 兼容旧浏览器 | 仅支持GET |
| Nginx代理 | 生产环境 | 前端无需修改 | 需服务器配置 |
3.3 实战配置指南
方案一:开发环境代理(HBuilderX)
配置 manifest.json:
{"h5": {"devServer": {"proxy": {"/api": {"target": "接口","changeOrigin": true,"pathRewrite": {"^/api": ""}}}}}
}
方案二:生产环境CORS
Node.js 示例:
// Express 中间件
app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');next();
});
方案三:Nginx反向代理
server {listen 80;server_name 域名;location /api/ {proxy_pass 接口;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
4. 总结
分层架构:通过封装实现业务逻辑与网络层的解耦
异常处理:统一处理401等状态码,增强用户体验
安全策略:HTTPS请求、Token刷新机制、请求签名
性能优化:合理设置超时时间(建议10-30秒),重要请求增加重试机制,大数据量使用分页加载
// 示例:请求重试机制
async function fetchWithRetry(url, retries = 3) {for (let i = 0; i < retries; i++) {try {return await http.get(url);} catch (err) {if (i === retries - 1) throw err;await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));}}
}
通过合理封装和正确配置,可以在UniApp中构建稳定高效的网络请求体系。建议根据实际项目需求调整封装方案,并做好各平台的兼容性测试。
相关文章:
uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互
全篇大概 3600 字(含代码),建议阅读时间 25min 📚 目录 使用uni.request发起请求封装全局请求工具破解跨域难题总结 在跨平台应用开发中,网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求,但…...
【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...
力扣27.移除元素(双指针)
题目看起来很乱,实际上意思是:把数组中值不等于val的元素放在下标为0,1,2,3......,并且返回数组中值不等于val的元素的个数 方法一:直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…...
VADv2: 基于矢量表征和概率规划的E2E架构
1. 写在前面 今天分享一篇自动驾驶领域的论文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率规划的E2E架构,2024年2月份华中科技大和地平线合作的一篇文章, 在经典的端到端模型架构上作出了基于概率规划去输出规划轨迹的…...
机器学习:强化学习的epsilon贪心算法
强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在通过与环境交互,使智能体(Agent)学习如何采取最优行动,以最大化某种累积奖励。它与监督学习和无监督学习不同,强调试错…...
授权与认证之jwt(一)创建Jwt工具类
JWT的Token要经过加密才能返回给客户端,包括客户端上传的Tokn,后端项目需要验证核 实。于是我们需要一个WT工具类,用来加密Token和验证Token的有效性。 一、导入依赖 <dependency><groupId>com.auth0</groupId><artifactId>jav…...
计算机毕业设计SpringBoot+Vue.js基于JAVA语言的在线考试与学习交流网页平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Difyにboto3を変更したカスタムDockerイメージの構築手順
Difyにboto3を変更したカスタムDockerイメージの構築手順 はじめに1. Dockerfileの作成2. Dockerイメージのビルド3. docker-compose.yamlの更新変更点: 4. コンテナの再起動注意事項まとめ はじめに DifyのDockerイメージに特定バージョンのboto3を変更する手順を…...
uniapp 中引入使用uView UI
文章目录 一、前言:选择 uView UI的原因二、完整引入步骤1. 安装 uView UI2. 配置全局样式变量(关键!)3. 在 pages.json中添加:4. 全局注册组件5. 直接使用组件 五、自定义主题色(秒换皮肤) 一、…...
数据图表ScottPlot.WPF用法示例
目录 一、添加 NuGet 程序包(5.0.47) 二、MainWindow.xaml中添加引用 三、MainWindow.xaml.cs 具体使用代码 图表示例: 一、添加 NuGet 程序包(5.0.47) 二、MainWindow.xaml中添加引用 <Window x:Class"…...
js加密之延伸requestAnimationFrame
简言 上篇文章有提到requestAnimationFrame,只是随笔带过。这篇文章就着重研究一下requestAnimationFrame的运用,以及实际作用。还有关于在js加密技术中的落地实现可行性。 功能说明 小声说一下,做开发的同学一定要学会翻官方文档,我这里直接引用一段官方介绍。 …...
系统架构设计师—计算机基础篇—存储管理
文章目录 基本概念地址重定位 存储管理方案分区存储管理分页存储管理做题的方法地址重定位淘汰页号 分段存储管理段页式存储管理虚拟存储管理 基本概念 地址重定位 地址重定位是指将程序中的虚拟地址(逻辑地址)变换称内存的真实地址(物理地…...
【第二十五周】:DeepPose:通过深度神经网络实现人体姿态估计
DeepPose 摘要Abstract文章信息引言DeepPose归一化网络结构初始网络(粗略估计所有关节点位置)精细化级联网络(分别修正每个关节点的位置) 疑问与解决代码实践总结 摘要 这篇博客介绍了DeepPose,这是首个基于深度神经网…...
SVN 简介
SVN 简介 引言 版本控制系统(Version Control System,VCS)是软件开发过程中不可或缺的工具之一。它能够帮助开发者管理代码的版本,追踪代码变更,协同工作,以及确保代码的稳定性和安全性。Subversion(简称SVN)是一种流行的版本控制系统,本文将为您详细介绍SVN的基本概…...
ARM Linux LCD上实时预览摄像头画面
文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…...
基于DeepSeek 的图生文最新算法 VLM-R1
目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...
《论软件测试中缺陷管理及其应用》审题技巧 - 系统架构设计师
论软件测试中缺陷管理及其应用写作框架 一、考点概述 本论题“论软件测试中缺陷管理及其应用”主要考查的是软件测试领域中的缺陷管理相关知识与实践应用。论题涵盖了以下几个核心内容: 首先,需要理解软件缺陷的基本概念,即软件中存在的破坏正常运行能力的问题、错误或隐…...
MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私
苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境(runtime),旨在简化在本地部署和使用大语言模型(LLM)的过程。它由 Vicarious 公司开发ÿ…...
python爬虫:pyspider的详细使用
文章目录 一、pyspider介绍1.1 核心概念1.2 与其他爬虫框架的比较二、 安装 pyspider三、编写爬虫脚本四、运行和监控爬虫4.1 启动爬虫4.2 监控任务状态4.3 任务管理五、高级功能5.1 分布式爬取5.2 JavaScript 渲染5.3 数据存储5.4 定时任务5.5 错误处理和重试机制六、示例:采…...
3-5 WPS JS宏 工作表的移动与复制学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接
官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...
删除变慢问题
问题: 有一个场景,每天都会删除数据,SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 ,一直循环执行,当执行到最后一次满足条件的时候,就会很慢 原理分析 索引与…...
创建一个MCP服务器,并在Cline中使用,增强自定义功能。
MCP介绍 MCP 是一个开放协议,它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样,MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...
游戏引擎学习第131天
仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化,特别是针对渲染和多线程的部分。目前,我们的目标是让地面块在独立线程上进行渲染,以提高性能。在此过程中,我…...
人大金仓国产数据库与PostgreSQL
一、简介 在前面项目中,我们使用若依前后端分离整合人大金仓,在后续开发过程中,我们经常因为各种”不适配“问题,但可以感觉得到大部分问题,将人大金仓视为postgreSQL就能去解决大部分问题。据了解,Kingba…...
《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》
--- ## 前言:为什么传统学习法正在杀死你的竞争力? 在新能源汽车领域,我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时,固态电池已进入量产倒计时;当自动驾驶还在L2级徘…...
存贮论模型案例与Matlab实现
摘要:本文结合存贮论确定性模型,详细解析经济订购批量(EOQ)、允许缺货生产批量等核心模型,并通过商品库存管理、生产计划等实际案例,配合Matlab代码实现,展示模型求解过程。涵盖公式推导、参数优…...
MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频
FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...
linux 内核dumpstack定位使用举例说明
1,在 Linux 内核中,当你需要定位问题时,dump_stack() 函数是一个非常有用的工具,那么什么时候使用dump_stack,怎么使用dump_stack呢 通常使用的是前者)函数通常在以下情况下被用来帮助定位问题: 调试内核代…...
360个人版和企业版的区别
功能方面 管理能力 个人版:主要用于单台设备的安全防护,只能在单独的电脑上进行安装使用,无集中管理和监控其他设备的功能。企业版:可批量管理大量电脑,如公司的十台、百台甚至千台电脑。管理员能通过管理控制台对所有…...
