当前位置: 首页 > ds >正文

鸿蒙应用网络开发实战: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') 里尝试重连,或者给用户一个“重新连接”的按钮。

总结

在鸿蒙应用中访问和使用网络资源,其实就是四个关键点:

  1. 配好权限;
  2. HTTP 请求(GET/POST/下载);
  3. WebSocket 实时通信;
  4. 网络可用性检测。

我们把这些功能封装在一个工具模块里,就能在项目里直接调用,减少重复代码。结合几个常见的场景——商品列表加载、订单提交、聊天、断网提示,你会发现这些接口用起来非常直观。

如果你正在写一个需要联网的鸿蒙应用,可以把这里的 NetUtils.ets 拿过去直接用,然后根据业务需求再加上进度回调、错误处理和重试机制,就能跑在生产环境了。

http://www.xdnf.cn/news/18701.html

相关文章:

  • 微信小程序和uni-app面试问题总结
  • 网络模型深度解析:CNI、Pod通信与NetworkPolicy
  • Spring Boot 实时广播消息
  • Java集合(Collection、Map、转换)
  • git实战(7)git常用命令速查表
  • GitHub发布革命性工具:GitHub Spark,用自然语言打造全栈智能应用
  • 商品与股指类ETF期权买卖五档Tick分钟级历史行情数据分析
  • Node.js 和 Express 面试问题总结
  • 目标跟踪 YOLO11 单目标跟踪
  • Maven仓库与Maven私服架构
  • Spring Boot 实现 POJO 级联封装复杂属性
  • React Hooks UseRef的用法
  • 高速CANFD收发器ASM1042在割草机器人轮毂电机通信系统中的适配性研究
  • 终结系统裸奔:Debian老旧版本安全加固终极指南
  • 梯度下降(线性回归为例)
  • 总结:Maven多仓库多镜像源配置
  • 【KO】前端面试五
  • MySQL存储过程详解
  • 【8位数取中间4位数】2022-10-23
  • 利用Prometheus监控服务器相关数据
  • 本地文件夹即时变身 Web 服务器(文件服务器)
  • 01数据结构-归并排序和计数排序
  • 用 Ansible 优雅部署 Kubernetes 1.33.3(RedHat 10)
  • 文件相关操作的函数和文件操作
  • AlexNet读取数据集 与VGG-11网络
  • 视频编码异常的表现
  • `strchr` 字符串查找函数
  • C++中的右值引用与通用引用:std::move与std::forward的正确使用 (Effective Modern C++ 条款25)
  • 《CF1245D Shichikuji and Power Grid》
  • 嵌入式学习 day57 驱动-驱动框架