跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端

HarmonyOS 网络请求实战:Axios 集成与用户列表交互

HarmonyOS 网络请求实战通过 @ohos/axios 库简化 HTTP 调用,结合 TypeScript 定义用户类型模型,在 ArkTS 组件中实现数据获取、响应式渲染及右滑删除交互。配置网络权限后,利用 List 与 ForEach 构建高性能列表,展示用户姓名邮箱,并通过 @State 状态管理确保 UI 随数据变化自动更新。

CloudNative发布于 2026/3/25更新于 2026/6/1122 浏览
HarmonyOS 网络请求实战:Axios 集成与用户列表交互

鸿蒙网络请求实战

在这里插入图片描述

安装三方库 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 中获得智能提示。

/**
 * 用户核心类型
 */
export class User {
  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;
  }
}

/**
 * 地理坐标类型
 */
class Geo {
  lat: string;
  lng: string;
  constructor(lat: string, lng: string) {
    this.lat = lat;
    this.lng = lng;
  }
}

/**
 * 地址类型
 */
class Address {
  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;
  }
}

/**
 * 公司信息类型
 */
class Company {
  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.ts 或 UserDemo.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 用法
  async getUser() {
    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/axios 从 jsonplaceholder.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.name、item.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. 获取数据的核心方法
async getUser() {
  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. 自定义构建器(删除按钮)
@Builder delBuilder(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.data(User[])赋值给 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 在鸿蒙中的使用,更深入理解了状态管理、列表渲染、手势交互三大核心能力,为构建复杂应用打下坚实基础。

目录

  1. 鸿蒙网络请求实战
  2. 安装三方库 axios
  3. 安装步骤
  4. 配置网络权限
  5. 网络请求测试
  6. 创建用户类(TypeScript 类型建模)
  7. 测试代码实现
  8. 创建用户列表(完整交互版)
  9. 页面部分代码解析
  10. 一、代码整体功能总结
  11. 二、逐部分详细解析
  12. 1. 依赖导入部分
  13. 2. 组件核心结构
  14. 3. 组件属性定义
  15. 4. 获取数据的核心方法
  16. 5. 自定义构建器(删除按钮)
  17. 6. 页面 UI 构建(build 方法)
  18. 三、代码运行流程
  19. 总结与延伸建议
  20. 核心技术栈
  21. 工程化建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 SpringBoot 的青年公寓服务平台
  • 应届生春招避坑指南:识别三无公司与保障劳动权益
  • 算法的“预谋”:前缀和如何改变游戏规则
  • 微信域名验证失败:使用 Nginx 配置返回验证文件内容
  • 本地部署 Apache Answer 问答系统并配置公网访问
  • AI 产品经理面试常见问题与高分回答策略
  • 论文阅读--Agent AI 探索多模态交互的前沿领域(一)
  • Leap AI 深度评测:媲美 Midjourney 的免费图像生成方案
  • Stable Diffusion 3.5 FP8 模型在消费级显卡上的部署与优化
  • Visual C++ Redistributable 运行库安装与故障排查指南
  • Flume架构深度解析:构建高可用大数据采集系统
  • pyenv-win Python 多版本管理实战与效率优化方案
  • Model Context Protocol (MCP) 详解:核心组件、发展与应用
  • OpenClaw 自托管 AI 网关安装与配置指南
  • Stable Diffusion 3.5 FP8 与 Figma 插件开发的技术对接方案
  • Superset vs Metabase:2024 年开源 BI 工具深度横评与选型指南
  • AIOps 实践:基于 Dify 与 LangBot 搭建飞书智能体
  • 我亲测 Megick 后直接上头!2026 最强 AI 创意工作室 零门槛秒出商业图视频 深度使用体验分享
  • 动态规划:买卖股票最佳时机(含冷冻期与手续费)
  • Kafka 核心架构与分布式存储深度解析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online