news 2026/4/16 21:49:56

HarmonyOS 网络请求与数据持久化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 网络请求与数据持久化

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

  • HarmonyOS 网络请求与数据持久化
    • 前言
    • 网络请求
      • 使用 http 模块发 GET 请求
      • 在 UI 线程中更新结果
      • POST 与请求体
      • 封装为 Promise(可选)
    • 数据持久化
      • Preferences 轻量键值存储
      • 关系型数据库(RDB)简要
    • 总结

HarmonyOS 网络请求与数据持久化

前言

HarmonyOS 应用开发中,网络请求和数据持久化是两类最常用的能力:前者用于拉取服务端数据,后者用于在本地缓存用户数据、配置等。ArkTS 侧通过@ohos.net.http@ohos.request等模块发请求,通过@ohos.data.preferences、关系型数据库等做持久化。

本文只讲这两块的核心 API 和典型用法,并给出关键代码与注意点,不贴完整 Demo。

网络请求

使用 http 模块发 GET 请求

@ohos.net.http提供 createHttp(),得到 httpRequest 对象后可发起请求。典型流程:创建 → 设置 URL/方法/头 → 请求 → 关闭。

importhttpfrom'@ohos.net.http'// 在页面或异步方法中consthttpRequest=http.createHttp()httpRequest.request('https://api.example.com/list',{method:http.RequestMethod.GET,header:{'Content-Type':'application/json'},connectTimeout:60000,readTimeout:60000},(err,data)=>{if(err){console.error('请求失败',err)return}if(data.responseCode===200){constresult=JSON.parse(data.resultasstring)// 更新 @State,驱动 UI 刷新}httpRequest.destroy()})

要点:

  • 回调在子线程执行:若要在回调里更新@State、刷新 UI,需要封装成runOnUIThread或使用异步封装(见下)
  • 务必 destroy:请求完成后调用httpRequest.destroy(),避免泄漏
  • 超时connectTimeoutreadTimeout按需设置,单位毫秒

在 UI 线程中更新结果

ArkTS 中 UI 只能在主线程更新,而 http 回调可能在工作线程,因此需要把「结果处理 + 状态更新」抛回主线程:

import{runOnUIThread}from'@kit/ArkUI'// 在 request 的回调里if(data.responseCode===200){constlist=JSON.parse(data.resultasstring)runOnUIThread(()=>{this.listData=list// this 指向 @Component,listData 为 @State})}

这样this.listData的变更会在主线程执行,触发界面刷新。

POST 与请求体

POST 请求只需把method改为http.RequestMethod.POST,并在extraData里传 body 字符串:

httpRequest.request('https://api.example.com/submit',{method:http.RequestMethod.POST,header:{'Content-Type':'application/json'},extraData:JSON.stringify({name:'test',id:1}),connectTimeout:60000,readTimeout:60000},(err,data)=>{// 同上,err/data 处理 + destroy})

服务端若要求表单编码,则Content-Type改为application/x-www-form-urlencodedextraData改为key1=value1&key2=value2等形式。

封装为 Promise(可选)

为避免回调嵌套、便于在 async 函数里使用,可对 request 做一层 Promise 封装:

functionrequest<T>(url:string,options:http.HttpRequestOptions):Promise<T>{constreq=http.createHttp()returnnewPromise((resolve,reject)=>{req.request(url,options,(err,data)=>{req.destroy()if(err){reject(err)return}if(data.responseCode>=200&&data.responseCode<300){try{resolve(JSON.parse(data.resultasstring)asT)}catch(e){reject(e)}}else{reject(newError(`HTTP${data.responseCode}`))}})})}

在页面里await request<RespType>(url, opts)得到结果后,再在runOnUIThread里赋给@State即可。

数据持久化

Preferences 轻量键值存储

@ohos.data.preferences适用于配置项、简单键值对,数据以文件形式存在应用沙箱内。

获取与读写:

importdataPreferencesfrom'@ohos.data.preferences'import{common}from'@kit.AbilityKit'// 在 EntryAbility 或异步上下文中constcontext=getContext(this)ascommon.UIAbilityContextconststore=awaitdataPreferences.getPreferences(context,'my_prefs')// 写awaitstore.put('token','xxx')awaitstore.put('userId',100)awaitstore.flush()// 读consttoken=awaitstore.get('token','')constuserId=awaitstore.get('userId',0)

注意:

  • getPreferences为异步,需在 async 函数或 Promise 中调用
  • 写入后建议调用flush()保证落盘
  • 键为 string,值为 string | number | boolean 等基础类型

在页面中的用法:aboutToAppear()里异步getPreferencesget,结果赋给@State;在用户操作(如登录成功)时put+flush,即可实现「打开应用读缓存、操作后写缓存」。

关系型数据库(RDB)简要

需要本地表结构、查询条件时,可使用关系型数据库。流程一般为:获取 RdbStore → 建表(若不存在)→ insert/update/query/delete。

获取 RdbStore:

importrelationalStorefrom'@ohos.data.relationalStore'constconfig:relationalStore.StoreConfig={name:'app.db',securityLevel:relationalStore.SecurityLevel.S1}conststore=awaitrelationalStore.getRdbStore(context,config)

建表与插入:

constsqlCreate=`CREATE TABLE IF NOT EXISTS user ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER )`awaitstore.executeSql(sqlCreate)constvalueBucket:relationalStore.ValuesBucket={name:'张三',age:20}awaitstore.insert('user',valueBucket)

查询:

constpredicates=newrelationalStore.RdbPredicates('user')predicates.equalTo('age',20)constresultSet=awaitstore.query(predicates,['id','name','age'])while(resultSet.goToNextRow()){constid=resultSet.getLong(resultSet.getColumnIndex('id'))constname=resultSet.getString(resultSet.getColumnIndex('name'))// 使用 id, name...}resultSet.close()

RDB 适合列表、草稿、离线缓存等结构化数据;简单配置仍建议用 Preferences,两者可搭配使用。

总结

  • 网络http.createHttp()发请求,回调中注意线程(用runOnUIThread更新 UI)和及时destroy;可按需封装为 Promise。
  • 持久化:配置/简单键值用dataPreferences.getPreferences的 put/get + flush;结构化数据用 RDB 建表 + insert/query。

把「请求 → 解析 → 主线程更新 @State」和「启动读 Preferences/RDB、操作后写回」串起来,即可覆盖大部分 HarmonyOS 应用的数据与持久化场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:16:10

libarchive: 一个几乎可以解压所有压缩文件的C语言库

目录 1.简介 2.安装与集成 3.核心接口说明 4.常见使用示例 4.1.不解压读取压缩包内指定文本 / 二进制文件 4.2.遍历压缩包内所有文件 / 文件夹&#xff08;仅列名&#xff0c;不读内容&#xff09; 4.3.解压压缩包全部文件到指定目录 4.4.解压压缩包内单个文件到指定目…

作者头像 李华
网站建设 2026/4/16 15:14:56

【开题答辩全过程】以 个性化旅游推荐系统的设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

作者头像 李华
网站建设 2026/4/16 14:29:47

【金融项目实战】4_接口测试 _数据准备和清理

文章目录一、接口测试数据准备1.1 通过系统页面构造(不推荐)1.2 通过接口构造1.3 通过数据库构造【推荐】二、接口测试数据清理一、接口测试数据准备 构造测试数据方式&#xff1a; 通过系统页面构造通过接口构造通过数据库构造 1.1 通过系统页面构造(不推荐) 优点&#xff…

作者头像 李华
网站建设 2026/4/16 11:14:34

惠普5200LX打印机驱动下载方法:告别失效困扰,3大路径高效适配

“驱动下载踩坑80%是因为找错渠道&#xff01;惠普5200LX适配有章可循” 作为深耕打印机问题解决领域5年的博主&#xff0c;小编每天都会收到大量用户咨询——“惠普5200LX驱动突然失效怎么办&#xff1f;”“下载的驱动安装后打印机还是无法使用”。这类问题看似琐碎&#xf…

作者头像 李华
网站建设 2026/4/16 12:44:57

程序员如何实现微信个人号API接口的高效对接?

在数字化运营的今天&#xff0c;私域团队常常陷入“时间陷阱”——员工70%的精力消耗在添加好友、社群维护、重复答疑等机械任务上&#xff0c;真正创造价值的策略与创意反而被压缩。这不仅消耗团队精力&#xff0c;更限制了企业的增长潜力。现在&#xff0c;破局时刻已至。什么…

作者头像 李华
网站建设 2026/4/16 12:01:30

30分钟搞定 Ingress Nginx 到 Higress 迁移?AI 帮我干完了脏活累活

作者&#xff1a;一个不想加班的网关运维 起因 周五下午四点半&#xff0c;老板把一条 Kubernetes 官方声明甩到群里&#xff1a; Ingress NGINX 将于 2026 年 3 月正式退役。 选择在退役后继续使用 Ingress NGINX&#xff0c;将使你和你的用户面临安全攻击风险。现有替代方案…

作者头像 李华