HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》

HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》
在这里插入图片描述


鸿蒙网络请求实战

安装三方库 axios

在鸿蒙应用开发中,网络请求是连接前端与后端服务的核心能力。虽然系统提供了 @ohos.net.http 原生模块,但其 API 较为底层。为了提升开发效率与代码可维护性,社区广泛采用 @ohos/axios —— 这是专为 OpenHarmony / HarmonyOS 适配的 Axios 版本,兼容熟悉的 Promise 与 async/await 语法,并支持 TypeScript 类型推断。

📦 三方库信息:名称:@ohos/axios版本:V2.2.7(截至 2026 年)仓库地址:@ohos/axios(V2.2.7)

安装步骤

  1. 访问 OHPM(OpenHarmony Package Manager)中心仓,搜索 @ohos/axios
  2. 点击“安装”按钮,系统将自动生成安装命令;
  3. 在 DevEco Studio 的 Terminal 中执行该命令。
在这里插入图片描述
ohpm install @ohos/axios 
验证安装
安装成功后,oh-package.json5 文件中会新增依赖项,且 node_modules/@ohos/axios 目录存在。
在这里插入图片描述

配置网络权限

鸿蒙应用默认禁止网络访问,必须显式声明权限。在 module.json5 文件的 requestPermissions 字段中添加:

{"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"}]}}
⚠️ 常见问题
若未配置此权限,axios 请求将直接失败,且错误信息可能不明确(如 Network Error)。
在这里插入图片描述

网络请求测试

我们使用经典的 JSONPlaceholder 模拟 API 服务,其 /users 接口返回 10 条用户数据,结构清晰,非常适合教学演示。

  • 测试接口https://jsonplaceholder.typicode.com/users
  • 返回格式:JSON 数组,每项包含 id, name, email, address, phone, website, company 等字段。
在这里插入图片描述

官方文档提供了详细的使用说明,包括泛型参数、拦截器、错误处理等高级用法。

在这里插入图片描述

创建用户类(TypeScript 类型建模)

为确保类型安全代码可读性,我们基于接口返回结构,定义完整的 TypeScript 类体系。这不仅能避免运行时错误,还能在 IDE 中获得智能提示。

/** * 用户核心类型 */exportclassUser{ id:number; name:string; username:string; email:string; address: Address; phone:string; website:string; company: Company;constructor(id:number, name:string, username:string, email:string, address: Address, phone:string, website:string, company: Company){this.id = id;this.name = name;this.username = username;this.email = email;this.address = address;this.phone = phone;this.website = website;this.company = company;}}/** * 地理坐标类型 */classGeo{ lat:string; lng:string;constructor(lat:string, lng:string){this.lat = lat;this.lng = lng;}}/** * 地址类型 */classAddress{ street:string; suite:string; city:string; zipcode:string; geo: Geo;constructor(street:string, suite:string, city:string, zipcode:string, geo: Geo){this.street = street;this.suite = suite;this.city = city;this.zipcode = zipcode;this.geo = geo;}}/** * 公司信息类型 */classCompany{ name:string; catchPhrase:string; bs:string;constructor(name:string, catchPhrase:string, bs:string){this.name = name;this.catchPhrase = catchPhrase;this.bs = bs;}}
💡 工程建议
此类文件应存放于 src/main/ets/common/ 目录下,命名为 UserModel.tsUserDemo.ts,便于跨组件复用。
在这里插入图片描述

测试代码实现

完成准备工作后,在页面组件中集成 axios 请求逻辑。

import axios,{ AxiosResponse }from'@ohos/axios';import{ User }from'../common/UserDemo'@Entry@Component struct Index { url:string='https://jsonplaceholder.typicode.com/users' users: User[]=[]// 支持 async/await 用法asyncgetUser(){try{const response: AxiosResponse =await axios.get<string, AxiosResponse<User>,null>(this.url);console.log('VON',JSON.stringify(response));}catch(error){console.error('VON',JSON.stringify(error));}}build(){Column(){Button('axios测试').onClick(()=>{this.getUser()})}}}
🔍 关键点解析axios.get<T, R, D>() 泛型参数依次为:响应数据类型、完整响应类型、请求体类型;当前写法中,response.data 应为 User[],但代码未赋值给 users,因此 UI 不会更新;后续我们将完善此逻辑,实现数据驱动视图
在这里插入图片描述

创建用户列表(完整交互版)

在基础请求之上,我们构建一个可交互的用户列表,支持:

  • 点击按钮加载数据;
  • 列表展示姓名与邮箱;
  • 右滑删除本地记录。

最终效果如下动图所示:

在这里插入图片描述

页面部分代码解析

一、代码整体功能总结

这段代码实现了一个完整的鸿蒙应用页面,具备以下能力:

  1. 网络请求:点击「获取数据」按钮,通过 @ohos/axiosjsonplaceholder.typicode.com 获取用户列表;
  2. 响应式渲染:将返回的 User[] 数据绑定到 @State 变量,自动驱动 List 组件更新;
  3. 交互操作:列表项支持右滑显示删除按钮,点击后从本地数组移除对应用户,UI 实时刷新;
  4. 类型安全:全程使用 TypeScript 类约束数据结构,避免属性访问错误。

二、逐部分详细解析

1. 依赖导入部分
import axios,{ AxiosResponse }from'@ohos/axios';import{ User }from'../common/UserDemo'
  • @ohos/axios:非 Web 标准 axios,而是针对鸿蒙网络栈(如 @ohos.net.http)封装的兼容层;
  • AxiosResponse:提供 data, status, headers 等标准字段的类型定义;
  • User:确保 response.data 被正确识别为 User[] 类型,IDE 可智能提示 item.nameitem.email 等属性。
📌 路径说明../common/UserDemo 表示从当前页面目录向上一级,再进入 common 文件夹。

2. 组件核心结构
@Entry@Component struct Index {// ...}
  • @Entry:标识该组件为应用主页面入口(通常对应 main_pages.json 中的首页);
  • @Component:声明此 struct 为 UI 组件,可被其他组件引用或作为页面根节点;
  • struct Index:ArkTS 中定义组件的标准方式,所有状态与方法均在此结构体内。

3. 组件属性定义
url:string='https://jsonplaceholder.typicode.com/users'@State users: User[]=[]
  • url:常量字符串,存储 API 地址;
  • @State users
    • @State 是 ArkTS 的响应式状态装饰器
    • users 数组被修改(如 push, splice),所有依赖它的 UI 元素(如 ForEach)会自动重新渲染;
    • 初始为空数组,确保页面首次加载时列表为空,避免 undefined 错误。
在这里插入图片描述

4. 获取数据的核心方法
asyncgetUser(){try{const response: AxiosResponse =await axios.get<string, AxiosResponse<User>,null>(this.url);this.users = response.data;// 关键:赋值触发 UI 更新console.log('VON',JSON.stringify(this.users));}catch(error){console.error('VON',JSON.stringify(error));}}
  • async/await:简化异步流程,避免 .then().catch() 嵌套;
  • 泛型校正:实际应写作 axios.get<User[], AxiosResponse<User[]>>,因为返回的是用户数组而非单个 User
  • 赋值操作this.users = response.data 是 UI 更新的关键——没有这一步,列表将始终为空;
  • 错误处理:捕获网络异常(如 DNS 失败、超时、HTTP 500),防止应用崩溃。
优化建议:可添加 loading 状态,防止重复点击。

5. 自定义构建器(删除按钮)
@BuilderdelBuilder(index:number){Row(){Button('🚮').onClick(()=>{this.users.splice(index,1);// 修改 @State 数组})}}
  • @Builder:用于封装可复用的 UI 片段,支持传参;
  • index:标识要删除的用户在数组中的位置;
  • splice(index, 1):原地删除数组元素,由于 users@State,此操作会触发 List 重绘;
  • 图标选择:使用 Unicode 表情 🚮(垃圾桶)提升视觉识别度。

6. 页面 UI 构建(build 方法)
build(){Column(){Button('获取数据').onClick(()=>{this.getUser()})List(){ForEach(this.users,(item: User, index:number)=>{ListItem(){Column(){Text('姓名:'+ item.name)Text('邮箱:'+ item.email)}.width('100%').height(40).justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start).margin(10)}.swipeAction({ end:this.delBuilder(index)})})}.width('100%').height('100%')}.width('100%').height('100%')}
  • Column:垂直布局容器,容纳按钮与列表;
  • List + ForEach
    • List 是高性能滚动列表组件,仅渲染可视区域项;
    • ForEach(data, itemGenerator, keyGenerator?) 遍历 users,为每个用户生成 ListItem
  • ListItem:列表单项,内部用 Column 展示两行文本;
  • .swipeAction({ end: ... })
    • end 表示从右侧滑入时显示的操作区;
    • 绑定 delBuilder(index),实现右滑删除功能;
    • 鸿蒙系统自动处理手势识别与动画。

三、代码运行流程

  1. 初始化users = []List 无内容;
  2. 点击按钮:调用 getUser(),发起 GET 请求;
  3. 请求成功response.dataUser[])赋值给 users,触发 ForEach 重建,列表显示 10 条用户;
  4. 右滑操作:用户向左滑动某一项,右侧出现垃圾桶按钮;
  5. 点击删除splice(index, 1) 修改数组,List 自动移除该项;
  6. 请求失败:控制台输出错误,UI 保持不变。

总结与延伸建议

核心技术栈

技术作用
@ohos/axios简化 HTTP 请求
@State实现数据驱动 UI
List + ForEach高性能列表渲染
swipeAction原生手势交互
TypeScript Class类型安全与结构化

工程化建议

  1. 错误边界处理:添加 Toast 提示“网络请求失败”;
  2. 加载状态:请求期间禁用按钮并显示“加载中…”;
  3. 分页支持:若数据量大,应分页加载;
  4. 真实 API 替换jsonplaceholder 仅为模拟,上线需对接真实后端;
  5. 持久化缓存:可结合 @ohos.data.preferences 缓存用户列表,提升体验。
🔒 安全提醒
生产环境中,切勿在前端硬编码敏感接口地址,应通过配置中心或环境变量管理。

通过本案例,开发者不仅掌握了 axios 在鸿蒙中的使用,更深入理解了状态管理、列表渲染、手势交互三大核心能力,为构建复杂应用打下坚实基础。

Read more

【大数据存储与管理】分布式文件系统HDFS:07 HDFS编程实践

【大数据存储与管理】分布式文件系统HDFS:07 HDFS编程实践

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、HDFS常用命令 * 二、HDFS的Web页面 * 三、HDFS常用Java API及应用实例 * (一)常用Java API介绍 * (二)应用实例 * 总结

By Ne0inhk
【优选算法】D&C-Mergesort-Harmonies:分治-归并的算法之谐

【优选算法】D&C-Mergesort-Harmonies:分治-归并的算法之谐

文章目录 * 1.概念解析 * 2.排序数组 * 3.交易逆序对的总数 * 4.计算右侧小于当前元素的个数 * 5.翻转对 * 希望读者们多多三连支持 * 小编会继续更新 * 你们的鼓励就是我前进的动力! 本篇是优选算法之分治-归并,简单来说就是一个不断分组排序再合并的过程 1.概念解析 🚩什么是分治-归并? 分治归并(基于分治思想的归并排序)是分治算法(Divide and Conquer)在排序问题中的经典应用,核心是通过 “拆分 - 排序 - 合并” 三步,将无序数组转化为有序数组,本质是 “化繁为简、再合简为繁” 的解题思路 2.排序数组 ✏️题目描述: ✏️示例: 传送门:排序数组 题解: 本质上分治归并就是一个后序遍历,而快排就是一个前序遍历,不断向下细分数组,然后从下往上把左右两分支的数组排序并合并,以此向上循环往复

By Ne0inhk

从对象思维到数据驱动:深度解析 C++ 内存布局优化与 SIMD 向量化,带你实现工业级算法性能的百倍飞跃

从对象思维到数据驱动:深度解析 C++ 内存布局优化与 SIMD 向量化,带你实现工业级算法性能的百倍飞跃 🚀 📝 摘要 (Abstract) 在高性能计算、游戏引擎及量化交易系统中,传统的面向对象编程(OOP)往往因为频繁的缓存缺失(Cache Miss)和低效的指令并行度而成为瓶颈。现代 C++ 的专业思考已从“如何构建对象层次”转向“数据如何在内存中流动”。本文将深入探讨 面向数据设计 (Data-Oriented Design, DOD) 的核心原理,重点解析 SoA (Structure of Arrays) 布局对 CPU 缓存的友好性,并结合 SIMD (单指令多数据流) 向量化技术,演示如何通过手动触发硬件并行指令实现算法性能的指数级提升。 一、 传统 OOP 的性能困境:为什么“万物皆对象”会导致 CPU

By Ne0inhk
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和

【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 目录 031  连续数组 1.1  解法一:暴力解法 1.2  解法二:前缀和在哈希表中 1.3  算法实现 1.3.1  C++实现 1.3.2  Java实现 1.4  博主手记 032  矩阵区域和 2.1

By Ne0inhk