news 2026/4/21 15:14:31

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/17 22:22:14

Docker 高级应用指南:企业级容器化实践

目录引言一、多阶段构建 (Multi-stage Builds)1.1 Go 应用多阶段构建示例1.2 Node.js 应用多阶段构建二、Docker Compose 高级特性2.1 环境变量管理2.2 覆盖配置三、安全强化与最佳实践3.1 安全扫描3.2 Docker 安全配置3.3 运行时安全配置四、CI/CD 集成4.1 GitHub Actions 示例…

作者头像 李华
网站建设 2026/4/18 17:19:42

Apptio:智能自动化规模化需要财务严谨性

Apptio公司&#xff08;IBM旗下&#xff09;EMEA地区首席技术官格雷格霍尔姆斯指出&#xff0c;成功实现智能自动化的规模化部署需要具备财务严谨性。传统的"先构建后推广"技术采用模式在自动化领域常常导致预算出现漏洞。许多企业高管发现&#xff0c;成功的试点项目…

作者头像 李华
网站建设 2026/4/21 5:58:22

Firefox浏览器新增AI功能但可选择关闭

Mozilla Firefox本月将添加新的AI功能&#xff0c;但用户可以选择关闭这些功能&#xff0c;Firefox负责人Ajit Varma在周二的博客文章中表示。 "AI正在改变网络&#xff0c;人们对它有着截然不同的需求&#xff0c;"Varma在文章中写道。"倾听我们的社区声音&…

作者头像 李华
网站建设 2026/4/17 23:19:35

屹晶微 EG44273 低压高速低侧单通道驱动芯片技术解析

在现代高频、高密度电源与电机控制系统中&#xff0c;一个兼具高速响应、强劲驱动能力与极致紧凑体积的低侧栅极驱动器&#xff0c;往往是实现高效、可靠功率转换的关键。EG44273 正是为此类需求而精心打造的解决方案。它采用超小型的 SOT23-5封装&#xff0c;在4V-20V的宽电压…

作者头像 李华