核心内容摘要
Atelier of Light and Shadow与STM32嵌入式开发:边缘AI应用实践
Flutter for OpenHarmony安全高效地使用网络请求三方库现代应用离不开网络通信。
在 Flutter for OpenHarmony 开发中虽然http和dio等主流网络库基于 Dart 标准库dart:io实现理论上具备跨平台能力但OpenHarmony 的安全策略、权限模型和网络栈实现仍可能引发连接失败、证书校验异常或权限拒绝等问题。
本文将完整演示如何在 OpenHarmony 设备上安全、稳定、高效地发起网络请求涵盖http与dio的基本使用JSON 数据解析拦截器与重试机制OpenHarmony 特有的网络权限与 HTTPS 配置常见连接问题排查目录
网络库选型http vs dio
OpenHarmony 网络权限配置关键
基础请求GET 与 POST
1 使用 http 库
2 使用 dio 库推荐
JSON 数据解析
高级功能拦截器与自动重试
OpenHarmony HTTPS 与证书校验
7.
常见问题与调试技巧
8.
总结
网络库选型http vs dio特性httpdio官方维护✅ 是❌ 社区功能丰富度基础✅ 拦截器、重试、取消、下载进度等OpenHarmony 兼容性✅ 良好✅ 良好基于http封装学习成本低中✅建议新项目优先使用dio其拦截器机制便于统一处理认证、日志、错误。
# pubspec.yamldependencies:dio:^
5.
0http:^
1.
0# 可选用于对比
OpenHarmony 网络权限配置关键即使代码正确若未声明网络权限OpenHarmony 将静默拒绝所有外网请求无异常抛出仅超时。
步骤在ohos/src/main/module.json5中添加权限{module:{// ...},requestPermissions:[{name:ohos.permission.INTERNET}]}无需动态申请INTERNET权限属于“普通权限”安装即授予。
⚠️注意若请求内网或自签名证书接口还需配置网络安全策略见第 6 节。
基础请求GET 与 POST
1 使用 http 库importpackage:http/http.dartashttp;finalresponseawaithttp.get(Uri.parse(https://api.example.com/users));if(response.statusCode
{print(response.body);}else{throwException(请求失败:${response.statusCode});}
2 使用 dio 库推荐importpackage:dio/dio.dart;finaldioDio();// GETfinalresponseawaitdio.get(https://api.example.com/users);// POST with JSONfinalresponseawaitdio.post(https://api.example.com/transactions,data:{amount:35,category:餐饮},options:Options(headers:{Content-Type:application/json}),);✅优势dio自动序列化Map为 JSON无需手动jsonEncode。
JSON 数据解析定义模型类并使用json_serializable纯 Dart兼容 OpenHarmony// lib/models/transaction.dartimportpackage:json_annotation/json_annotation.dart;parttransaction.g.dart;JsonSerializable()classTransaction{finalStringid;finaldouble amount;finalStringcategory;finalString?note;Transaction({requiredthis.id,requiredthis.amount,requiredthis.category,this.note});factoryTransaction.fromJson(MapString,dynamicjson)_$TransactionFromJson(json);MapString,dynamictoJson()_$TransactionToJson(this);}解析响应finaljsonresponse.dataasMapString,dynamic;finaltransactionTransaction.fromJson(json); 运行构建命令生成transaction.g.dartflutter pub run build_runner build
高级功能拦截器与自动重试添加日志与认证拦截器finaldioDio(BaseOptions(baseUrl:https://api.example.com));dio.interceptors.add(InterceptorsWrapper(onRequest:(options,handler){options.headers[Authorization]Bearer$token;print(→${options.method}${options.path});returnhandler.next(options);},onResponse:(response,handler){print(←${response.statusCode});returnhandler.next(response);},onError:(DioExceptionerr,handler){print(✗ 网络错误:${err.message});returnhandler.next(err);},));自动重试机制网络不稳定时dio.interceptors.add(RetryInterceptor(dio:dio,retries:2,retryDelay:constDuration(seconds:
,));✅适用场景OpenHarmony 设备在弱网环境下如 IoT 设备提升成功率。
OpenHarmony HTTPS 与证书校验OpenHarmony 默认严格校验证书有效性有效期、域名、CA 信任链。
问题现象请求自签名 HTTPS 接口 → 抛出HandshakeException使用 IP 地址访问 → 证书域名不匹配解决方案仅限开发/测试环境finaldioDio();(dio.httpClientAdapterasDefaultHttpClientAdapter).onHttpClientCreate(HttpClientclient){client.badCertificateCallback(cert,host,port)true;// 忽略证书错误returnclient;};生产环境严禁此操作应使用有效 CA 签发的证书。
正确做法使用域名非 IP证书包含正确 SANSubject Alternative Name由可信 CA 签发如 Let’s Encrypt
7.
常见问题与调试技巧问题原因解决方案请求超时无错误日志未配置INTERNET权限检查module.json5HTTPS 证书错误自签名或域名不匹配开发用badCertificateCallback生产用正规证书POST 数据未发送未设置Content-Type: application/json在Options中显式声明OpenHarmony 模拟器无法联网模拟器网络配置问题改用真机测试或检查 DevEco 网络代理调试命令# 查看设备网络日志hdc shell hilog -t net -L
8.
总结在 Flutter for OpenHarmony 中使用网络库需牢记三点权限先行务必在module.json5中声明ohos.permission.INTERNETHTTPS 合规生产环境必须使用有效证书避免忽略校验优选 dio利用拦截器统一处理认证、日志、重试提升健壮性通过合理配置与错误处理http和dio均可在 OpenHarmony 设备上稳定运行为跨端应用提供可靠的网络通信能力。
欢迎加入开源鸿蒙跨平台社区 https://openharmonycrossplatform.csdn.net