首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HarmonyOS 网络请求与数据持久化

HarmonyOS 网络请求与数据持久化

作者头像
程序猿的栖息地
发布2026-07-07 15:28:15
发布2026-07-07 15:28:15
60
举报

HarmonyOS 网络请求与数据持久化参考

HTTP 网络请求

@ohos.net.http 基础请求

代码语言:javascript
复制
import http from '@ohos.net.http'
 
// GET 请求
async function fetchData(url: string): Promise<ResponseData> {
 const httpRequest = http.createHttp()
 try {
 const response = await httpRequest.request(url, {
 method: http.RequestMethod.GET,
 header: { 'Content-Type': 'application/json' },
 connectTimeout: 60000,
 readTimeout: 60000,
 extraData: {} // GET请求通常不需要
 })
 if (response.responseCode === 200) {
 const result = JSON.parse(response.result as string) as ResponseData
 return result
 } else {
 throw new Error(`HTTP Error: ${response.responseCode}`)
 }
 } finally {
 httpRequest.destroy() // 必须销毁请求对象
 }
}
 
// POST 请求
async function postData(url: string, body: Object): Promise<ResponseData> {
 const httpRequest = http.createHttp()
 try {
 const response = await httpRequest.request(url, {
 method: http.RequestMethod.POST,
 header: {
 'Content-Type': 'application/json',
 'Authorization': `Bearer ${getToken()}`
 },
 extraData: JSON.stringify(body)
 })
 return JSON.parse(response.result as string) as ResponseData
 } finally {
 httpRequest.destroy()
 }
}
 
// PUT / DELETE 请求类似,修改 method 即可

请求事件监听

代码语言:javascript
复制
const httpRequest = http.createHttp()
 
httpRequest.on('headerReceive', (err, header) => {
 console.info('收到响应头')
})
 
httpRequest.on('dataReceive', (data) => {
 console.info('收到数据片段')
})
 
httpRequest.on('dataEnd', () => {
 console.info('数据接收完毕')
})
 
httpRequest.on('responseReceive', (response) => {
 console.info('完整响应')
})
 
// 流式接收(大文件)
httpRequest.requestInStream(url, options)
 
// 取消请求
httpRequest.destroy()

封装网络请求工具类

代码语言:javascript
复制
import http from '@ohos.net.http'
const BASE_URL = 'https://api.example.com'
interface ApiResponse<T> {
 code: number
 message: string
 data: T
}
class HttpClient {
 private static instance: HttpClient
 private token: string = ''
 static getInstance(): HttpClient {
 if (!HttpClient.instance) {
 HttpClient.instance = new HttpClient()
 }
 return HttpClient.instance
 }
 setToken(token: string) {
 this.token = token
 }
 private getHeaders(): Record<string, string> {
 const headers: Record<string, string> = {
 'Content-Type': 'application/json'
 }
 if (this.token) {
 headers['Authorization'] = `Bearer ${this.token}`
 }
 return headers
 }
 async get<T>(path: string, params?: Record<string, string>): Promise<ApiResponse<T>> {
 let url = `${BASE_URL}${path}`
 if (params) {
 const query = Object.entries(params)
 .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
 .join('&')
 url += `?${query}`
 }
 return this.request<T>(url, http.RequestMethod.GET)
 }
 async post<T>(path: string, body?: Object): Promise<ApiResponse<T>> {
 const url = `${BASE_URL}${path}`
 return this.request<T>(url, http.RequestMethod.POST, body)
 }
 async put<T>(path: string, body?: Object): Promise<ApiResponse<T>> {
 const url = `${BASE_URL}${path}`
 return this.request<T>(url, http.RequestMethod.PUT, body)
 }
 async delete<T>(path: string): Promise<ApiResponse<T>> {
 const url = `${BASE_URL}${path}`
 return this.request<T>(url, http.RequestMethod.DELETE)
 }
 private async request<T>(
 url: string,
 method: http.RequestMethod,
 body?: Object
 ): Promise<ApiResponse<T>> {
 const httpRequest = http.createHttp()
 try {
 const response = await httpRequest.request(url, {
 method,
 header: this.getHeaders(),
 connectTimeout: 30000,
 readTimeout: 30000,
 extraData: body ? JSON.stringify(body) : undefined
 })
 if (response.responseCode === 200) {
 return JSON.parse(response.result as string) as ApiResponse<T>
 }
 if (response.responseCode === 401) {
 // Token 过期处理
 this.handleAuthError()
 throw new Error('认证过期')
 }
 throw new Error(`请求失败: ${response.responseCode}`)
 } catch (error) {
 console.error(`HTTP Error: ${error}`)
 throw error
 } finally {
 httpRequest.destroy()
 }
 }
 private handleAuthError() {
 this.token = ''
 // 跳转登录页或刷新token
 }
}
export default HttpClient.getInstance()

数据持久化

Preferences 轻量存储(键值对)

代码语言:javascript
复制
import preferences from '@ohos.data.preferences'
 
const PREFERENCES_NAME = 'my_app_prefs'
 
async function getPreferences(context: Context): Promise<preferences.Preferences> {
 return preferences.getPreferences(context, PREFERENCES_NAME)
}
 
// 写入
async function saveSetting(context: Context, key: string, value: preferences.ValueType) {
 const prefs = await getPreferences(context)
 await prefs.put(key, value)
 await prefs.flush() // 持久化到磁盘
}
 
// 读取
async function getSetting(context: Context, key: string): Promise<preferences.ValueType> {
 const prefs = await getPreferences(context)
 return prefs.get(key, '') // 默认值
}
 
// 删除
async function removeSetting(context: Context, key: string) {
 const prefs = await getPreferences(context)
 await prefs.delete(key)
 await prefs.flush()
}
 
// 清空
async function clearSettings(context: Context) {
 const prefs = await getPreferences(context)
 await prefs.clear()
 await prefs.flush()
}
 
// 常用存储场景
// saveSetting(context, 'user_token', 'xxx')
// saveSetting(context, 'is_first_launch', true)
// saveSetting(context, 'last_login_time', 1700000000)

RelationalDB 关系型数据库(SQLite)

代码语言:javascript
复制
import relationalStore from '@ohos.data.relationalStore'
 
const STORE_CONFIG: relationalStore.StoreConfig = {
 name: 'app_database.db',
 securityLevel: relationalStore.SecurityLevel.S1
}
 
// 建表
const CREATE_TABLE_SQL = `
 CREATE TABLE IF NOT EXISTS user (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 name TEXT NOT NULL,
 age INTEGER,
 created_at INTEGER
 )
`
 
async function initDB(context: Context): Promise<relationalStore.RdbStore> {
 const store = await relationalStore.getRdbStore(context, STORE_CONFIG)
 await store.executeSql(CREATE_TABLE_SQL)
 return store
}
 
// 插入数据
async function insertUser(store: relationalStore.RdbStore, user: User): Promise<number> {
 const valueBucket: relationalStore.ValuesBucket = {
 'name': user.name,
 'age': user.age,
 'created_at': Date.now()
 }
 return store.insert('user', valueBucket)
}
 
// 查询数据
async function queryUsers(store: relationalStore.RdbStore, ageFilter?: number): Promise<User[]> {
 const predicates = new relationalStore.RdbPredicates('user')
 if (ageFilter) {
 predicates.equalTo('age', ageFilter)
 }
 predicates.orderByDesc('created_at')
 
 const resultSet = await store.query(predicates)
 const users: User[] = []
 
 while (resultSet.goToNextRow()) {
 users.push({
 id: resultSet.getLong(resultSet.getColumnIndex('id')),
 name: resultSet.getString(resultSet.getColumnIndex('name')),
 age: resultSet.getLong(resultSet.getColumnIndex('age')),
 created_at: resultSet.getLong(resultSet.getColumnIndex('created_at'))
 })
 }
 resultSet.close()
 return users
}
 
// 更新数据
async function updateUser(store: relationalStore.RdbStore, id: number, name: string): Promise<number> {
 const valueBucket: relationalStore.ValuesBucket = { 'name': name }
 const predicates = new relationalStore.RdbPredicates('user')
 predicates.equalTo('id', id)
 return store.update(valueBucket, predicates)
}
 
// 删除数据
async function deleteUser(store: relationalStore.RdbStore, id: number): Promise<number> {
 const predicates = new relationalStore.RdbPredicates('user')
 predicates.equalTo('id', id)
 return store.delete(predicates)
}

KV-Store 分布式键值数据库

代码语言:javascript
复制
import distributedKVStore from '@ohos.data.distributedKVStore'
 
// 创建 KV-Store
const options: distributedKVStore.Options = {
 createIfMissing: true,
 encrypt: false,
 backup: false,
 autoSync: true, // 自动同步到其他设备
 kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION
}
 
async function createKVStore(context: Context): Promise<distributedKVStore.SingleKVStore> {
 return distributedKVStore.createKVStore(context, 'distributed_store', options)
}
 
// 写入
kvStore.put('sync_key', 'sync_value')
 
// 读取
const value = await kvStore.get('sync_key')
 
// 同步数据到其他设备
kvStore.sync(['device_id_1', 'device_id_2'], distributedKVStore.SyncMode.PUSH_ONLY)

文件存储

应用文件目录

代码语言:javascript
复制
import fileIo from '@ohos.file.fs'
 
// 应用私有目录
const filesDir = context.filesDir // /data/app/el2/100/.../files
const cacheDir = context.cacheDir // /data/app/el2/100/.../cache
const tempDir = context.tempDir // /data/app/el2/100/.../temp
const preferencesDir = context.preferencesDir
 
// 写文件
const file = fileIo.openSync(`${filesDir}/data.json`, fileIo.OpenMode.CREATE | fileIo.OpenMode.WRITE_ONLY)
fileIo.writeSync(file.fd, JSON.stringify(data))
fileIo.closeSync(file)
 
// 读文件
const readFile = fileIo.openSync(`${filesDir}/data.json`, fileIo.OpenMode.READ_ONLY)
const content = fileIo.readSync(readFile.fd)
fileIo.closeSync(readFile)
 
// 判断文件是否存在
const exists = fileIo.accessSync(`${filesDir}/data.json`)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HarmonyOS 网络请求与数据持久化参考
  • HTTP 网络请求
    • @ohos.net.http 基础请求
    • 请求事件监听
    • 封装网络请求工具类
  • 数据持久化
    • Preferences 轻量存储(键值对)
    • RelationalDB 关系型数据库(SQLite)
    • KV-Store 分布式键值数据库
    • 文件存储
    • 应用文件目录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档