news 2026/2/16 10:37:49

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/2/14 16:34:46

Python 初级入门教程:从零开始掌握编程基础

目录 引言一、Python 简介与特点二、环境搭建与准备工作三、Python 基础语法详解3.1 变量与数据类型3.2 控制结构3.3 函数定义与使用 四、常用数据结构与操作4.1 列表操作4.2 字典操作 五、文件操作与异常处理5.1 文件操作5.2 异常处理 六、实用案例&#xff1a;学生成绩管理系…

作者头像 李华
网站建设 2026/2/15 20:52:30

AI产品经理转型指南:从零入行大模型产品经理的核心能力与实战路径_0经验如何快速转型AI产品经理?

文章分析了AI产品经理岗位的热门现状及转型难点&#xff0c;指出经验与岗位要求不匹配是主要问题。介绍了专业型和应用层两类AI产品经理能力模型&#xff0c;强调了产品建设能力、行业理解、技术理解和AI落地经验四大核心能力。最后推荐了产品经理私教陪跑实战营&#xff0c;提…

作者头像 李华
网站建设 2026/2/15 10:46:21

抖音商家如何快速精准的找到自己需要的达人?

从海量达人中锁定最适合的合作对象&#xff0c;抖音商家达人筛选全攻略在此。 在抖音电商生态中&#xff0c;达人合作已成为品牌获取流量、提升销量的重要途径。面对平台上数以万计的带货达人&#xff0c;许多商家却陷入“盲目寻找”或“选择困难”的困境。 如何从海量达人中找…

作者头像 李华
网站建设 2026/2/15 20:54:33

合格Java程序员必备:Spring全家桶技术!

Spring这个技术栈&#xff0c;在LZ心目中一直是最好的Java项目&#xff0c;没有之一。这玩意面试必考工作必用&#xff0c;是我们Java人的饭碗&#xff1b;它跟它后面诞生的一系列解决方案被我们亲切的成为Spring全家桶&#xff0c;如果你自诩是一名合格的Java程序员&#xff0…

作者头像 李华