鸿蒙应用网络开发实战:HTTP、WebSocket、文件下载与网络检测全攻略
摘要
在现代应用开发里,网络几乎是必不可少的能力。不管是社交类应用、在线教育、还是电商购物,应用都需要和后端服务进行数据交互。鸿蒙(HarmonyOS)的 ArkTS 提供了比较完整的网络 API,包括 HTTP 请求、WebSocket 实时通讯、文件下载,以及网络状态检测。本文会带你从权限配置开始,一步步写出能跑的 Demo,并结合实际场景,展示如何在项目里高效地使用网络资源。
引言
随着鸿蒙生态逐渐成熟,越来越多的应用需要接入远程服务:
- App 启动时要拉取配置;
- 用户操作时需要发送请求更新数据;
- 大文件需要下载保存到本地;
- 聊天、推送等场景则离不开实时连接。
如果你刚接触鸿蒙的网络 API,可能会有点摸不清套路:权限怎么配?HTTP 和 WebSocket 怎么写?网络断了要怎么感知?接下来我们就通过一个完整的工具模块,把这些问题都跑通。
基础准备:权限配置
在 module.json5
里声明权限,这是应用能否访问网络的前提:
{"module": {"requestPermissions": [{ "name": "ohos.permission.INTERNET" },{ "name": "ohos.permission.GET_NETWORK_INFO" }]}
}
封装一个网络工具模块
我们先写一个 NetUtils.ets
模块,把常用的操作都放在一起,后续用的时候直接导入。
// NetUtils.ets
import http from '@ohos.net.http'
import fs from '@ohos.file.fs'
import websocket from '@ohos.net.websocket'
import connectivity from '@ohos.net.connectivity'const client = http.createHttp()// GET 请求
export async function getJson<T>(url: string): Promise<T> {const res = await client.request(url, {method: http.RequestMethod.GET,header: { 'Accept': 'application/json' },connectTimeout: 5000,readTimeout: 8000,})if (res.responseCode !== 200) throw new Error(`HTTP ${res.responseCode}`)return JSON.parse(res.result as string)
}// POST 请求
export async function postJson<T>(url: string, data: Record<string, unknown>): Promise<T> {const res = await client.request(url, {method: http.RequestMethod.POST,header: { 'Content-Type': 'application/json' },extraData: JSON.stringify(data),})return JSON.parse(res.result as string)
}// 下载文件
export async function downloadFile(url: string, savePath: string): Promise<string> {const res = await client.request(url, {method: http.RequestMethod.GET,expectDataType: http.HttpDataType.ARRAY_BUFFER,})const arrBuff = res.result as ArrayBufferconst fd = fs.openSync(savePath, fs.OpenMode.CREATE | fs.OpenMode.WRITE_ONLY)fs.writeSync(fd, new Uint8Array(arrBuff))fs.closeSync(fd)return savePath
}// WebSocket
export function startWs(url: string) {const ws = websocket.createWebSocket()ws.on('open', () => {console.log('ws connected')ws.send('hello server')})ws.on('message', (msg) => console.log('ws message:', msg.data))ws.on('close', () => console.log('ws closed'))ws.on('error', (e) => console.error('ws error', e))ws.connect(url)return ws
}// 网络可用性
export async function hasNetwork(): Promise<boolean> {try {const net = await connectivity.getDefaultNet()return !!net} catch {return false}
}export function watchNetwork(fn: (up: boolean) => void) {connectivity.on('netAvailable', () => fn(true))connectivity.on('netLost', () => fn(false))
}// 清理
export function dispose() {client.destroy()
}
这样一来,你的项目里只需要引入 NetUtils
,就能随时发请求或监听网络状态。
场景应用
拉取首页数据(GET 请求)
比如一个电商应用,打开首页需要拉取商品列表:
import { getJson } from './NetUtils'interface Item { id: number; name: string; price: number }async function loadHomeData() {try {const items = await getJson<Item[]>('https://api.example.com/items')console.log('商品数量:', items.length)} catch (err) {console.error('加载失败:', err)}
}
这里我们通过 getJson
直接拿到了数组对象,不需要自己去拼接 JSON 解析逻辑。
提交订单(POST 请求)
在下单时,需要把购物车的数据提交到服务器:
import { postJson } from './NetUtils'async function createOrder() {const order = { userId: 1, productId: 101, count: 2 }const res = await postJson<{ orderId: string }>('https://api.example.com/orders', order)console.log('下单成功,订单号:', res.orderId)
}
因为封装了 postJson
,所以调用时只需要传对象即可,返回值会自动解析成目标类型。
实时聊天(WebSocket)
聊天功能通常需要长连接:
import { startWs } from './NetUtils'function connectChat() {const ws = startWs('wss://echo.websocket.events')setTimeout(() => ws.send('你好,这是一条消息'), 2000)
}
这个例子用的是一个回声服务,适合测试。在真实项目里,你可以替换为后端的聊天服务器地址。
网络状态检测
有时候我们需要在用户断网时提示他们:
import { watchNetwork } from './NetUtils'watchNetwork((up) => {if (up) {console.log('网络已恢复')} else {console.log('网络断开,请检查连接')}
})
这样用户在 WiFi/4G 切换、网络断开时,都能及时收到提示。
QA 环节
Q: HTTP 客户端需要每次都 createHttp()
吗?
A: 不需要,最好复用同一个实例,减少资源消耗。退出应用时再 destroy()
。
Q: HTTPS 自签名证书能用吗?
A: 默认只信任系统 CA,自签名需要额外配置,具体要看安全策略。
Q: 文件下载很大怎么办?
A: 建议分块下载,并在写入时加上进度条提示,可以通过响应头里的 content-length
来计算进度。
Q: WebSocket 断线了怎么办?
A: 可以在 on('close')
里尝试重连,或者给用户一个“重新连接”的按钮。
总结
在鸿蒙应用中访问和使用网络资源,其实就是四个关键点:
- 配好权限;
- HTTP 请求(GET/POST/下载);
- WebSocket 实时通信;
- 网络可用性检测。
我们把这些功能封装在一个工具模块里,就能在项目里直接调用,减少重复代码。结合几个常见的场景——商品列表加载、订单提交、聊天、断网提示,你会发现这些接口用起来非常直观。
如果你正在写一个需要联网的鸿蒙应用,可以把这里的 NetUtils.ets
拿过去直接用,然后根据业务需求再加上进度回调、错误处理和重试机制,就能跑在生产环境了。