鸿蒙开发手册HARMONYOS

CHAPTER 07客户端通信 · NETWORKING

网络层

App 大多是个"漂亮的网络客户端"。本章讲透 @ohos.net.http、axios 封装、JSON 解析、拦截与缓存策略。

开始阅读难度中级约2.5小时
07.1

网络层职责

集中管理请求构造、解析、错误归一化、鉴权与缓存,UI 只说"我要用户",拿到类型安全模型。

分层

传输层(http/axios)→ 接口层(API 声明)→ 仓储层(转领域模型)。接口层用接口描述,便于 Mock。

07.2

http 基础

用 @ohos.net.http 创建请求,配置 URL/方法/头,await 获取响应与状态码。

import http from '@ohos.net.http'
const req = http.createHttp()
const res = await req.request('https://api.example.com/users/42', { method: http.RequestMethod.GET })
if (res.responseCode === 200) { const data = JSON.parse(res.result as string) }
req.destroy()
07.3

axios 封装

@ohos/axios 提供 Promise 风格 API,可集中配置 baseURL、拦截器与超时。

import axios from '@ohos/axios'
const client = axios.create({ baseURL: 'https://api.example.com', timeout: 10000 })
client.interceptors.request.use((cfg) => { cfg.headers.Authorization = 'Bearer '+token; return cfg })
const { data } = await client.get<User>('/users/42')
07.4

JSON 解析

用 class-transformer 或手动映射把 JSON 转成类型化模型;字段名不一致时用映射函数。

interface User { id: number; userName: string }
const user = JSON.parse(res.result as string) as User
防御式解析

服务端字段漂移会抛解析异常。生产用可选字段 + 默认值,并 catch 上报,避免整页崩溃。

07.5

拦截与鉴权

用 axios 拦截器统一注入鉴权头、日志与错误处理,业务接口保持干净。

07.6

缓存与重试

弱实时数据可加本地缓存(Preferences/RDB)与指数退避重试,提升体验与韧性。

async function withRetry<T>(op: () => Promise<T>, n=3): Promise<T> {
  for (let i=0;i<n;i++){ try { return await op() } catch(e){ if(i===n-1) throw e; await sleep(2**i*200) } }
  throw new Error('unreachable')
}
07.7

Mock 与测试

让 Repository 依赖接口,测试时注入返回假数据的实现,业务测试不触网。

07.8

常见陷阱

为什么请求偶发失败查不到原因?

错误常被吞掉:解析失败、非 2xx 没拦截、超时未配置。统一在网络层 catch 并归一化为业务错误。

忘记 destroy 会怎样?

原生 http 请求对象需 destroy,否则会泄漏连接资源。用 axios 则交给其内部管理。

07.9

实战练习

延伸资源