Flutter for OpenHarmony:Flutter 三方库 awesome_dio_interceptor 极度舒适的网络日志格式化拦截器
开源鸿蒙跨平台社区推出awesome_dio_interceptor插件,为OpenHarmony应用开发者提供优雅的网络请求日志格式化方案。该拦截器能将Dio网络请求的入参、出参和异常以工整的表格形式输出,支持自动缩进多层级JSON、生成可调试的curl命令,并解决了鸿蒙平台日志过滤问题。通过简单配置即可接入,支持自定义日志输出到鸿蒙Hilog系统,实现网络日志与业务日志分离。特别优化了大文件上
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

前言
在进行鸿蒙(OpenHarmony)商业级应用开发时,Dio 几乎是每个项目标配的网络底层库。然而,Dio 自带的 LogInterceptor 输出的日志完全挤成一团且毫无色彩边界,开发者在海量的调试板信息中寻找接口 Header 和参数体常常会导致视力模糊甚至抓狂。awesome_dio_interceptor 提供了一套"华丽生动(Awesome)" 的格式化输出方案。通过非常简单的挂载,即刻能够将网络请求中的入参、出参和异常以一种极其工整的表格边界形式呈现在鸿蒙设备的控制台中。
一、原理解析 / 概念介绍
1.1 基础概念
作为一个纯粹的 “拦截件 (Interceptor)”,该包深入且无缝地横插于你的 Dio 发送(Request)和接收(Response)管道之间。它的唯一使命是:监听流经此处的所有的流量,运用字符画线条把它包装为高度人类可读的区块。
1.2 进阶概念
- CURL 化生成 (CURL Command):除了看日志,它甚至能够一键帮你把本次复杂的请求拼装成一条能够在终端直接测试运行的 Bash
curl命令。当跟后端排查接口锅属谁的时候,提供了最直接的证据。
二、核心 API / 组件详解
2.1 作为插件简单外挂入 Dio
不需要复杂的实例化构造,它极其易用:
import 'package:dio/dio.dart';
// 引入这个惊艳的日志助手工具
import 'package:awesome_dio_interceptor/awesome_dio_interceptor.dart';
void configureHarmonyNetworkLog() {
final dioClient = Dio();
// 仅仅需要往中间件组中添加这个神器对象
dioClient.interceptors.add(
AwesomeDioInterceptor(
// 以下可定义极其自由的私人订制选项:
logRequestTimeout: false, // 是否要打印超时细节时间
logRequestHeaders: true, // 必须开启查明是否缺席认证头!
logResponseHeaders: false, // 收回的响应头太长可以关掉保持清爽
logger: debugPrint, // 💡 鸿蒙必备:桥接到 debugPrint 确保日志可见
),
);
debugPrint('✅ Dio 已装配上超级打印机!开启抓包盲测极爽模式。');
}

三、场景示例
3.1 场景一:解决长参数与多层级 JSON 报文调试难题
当我们的订单接口发出去的数据有着深达五层的内嵌 Map 时,传统打印会变成一长串连绵不散的字符串。本拦截器能够自动识别并重新进行纵向缩进:
void submitHarmonyStoreOrder(BuildContext context) async {
final dio = Dio();
// 💡 基于最新版本的正确 API 参数 logger
dio.interceptors.add(AwesomeDioInterceptor(
logRequestHeaders: true,
logResponseHeaders: true,
logger: debugPrint, // 强制将原生的打印重定向鸿蒙端可见!
));
// 💡 模拟一个深层次的表单
final giantPayload = {
'user_env': 'OpenHarmony NEXT 4.0',
'goods': [
{'id': 'HMS-9092', 'qty': 2},
],
'address': {
'city': '深市',
'loc': {'lat': 22.5, 'lng': 114.0}
}
};
try {
// 发出一个 GET 请求同时附带 Body 以测试多层级 JSON 结构的渲染提取
await dio.get('https://uapis.cn/api/v1/misc/hotboard?type=weibo',
data: giantPayload);
} catch (e) {
debugPrint("⚠️ 由于附带了请求体或服务端限制可能报错,但终端之上方已打印出 JSON 格式的请求正文: $e");
}
}

3.2 场景二:开发期间提取 Curl 用于验证
与服务端联调时,因为配置等原因导致报错,需要让后台同学确认。
final debugInterceptor = AwesomeDioInterceptor(
// 👑 必须将其指定为鸿蒙能够收集输出的打印通道:
logger: (printLog) {
debugPrint("🕸️拦截探针: $printLog");
},
);
四、要点讲解 & OpenHarmony 平台适配挑战
4.1 如何融入鸿蒙特有的 Hilog 体系
在规范的 OpenHarmony 原生工程体系下,普通的 print() 有时在经过打包后可能会被舍弃、或者难以在 DevEco Studio 的日志控制面板精准筛选出来!
💡 重要警告:在鸿蒙 NEXT 或真机模拟器调试中,开发者常发现拦截器已经挂载但控制台"毫无反应"。这是因为
awesome_dio_interceptor底层默认使用dart:developer的log()函数进行输出,而鸿蒙系统日志有时会过滤或缓冲该通道的内容。
⚠️ API 参数踩坑提醒:在
awesome_dio_interceptor 1.3.0版本中,自定义打印的参数名为logger(而非网上很多教程中写的logPrint)。如果误写为logPrint,编译器会直接报No named parameter错误。
开发进阶:融合鸿蒙 Hilog 领域码实现分类筛选
为了避免普通 debugPrint 日志混杂,如果你希望网络日志带上鸿蒙底层的领域码(domain)和标签(tag),方便在 DevEco Studio 中按模块精准过滤,可以将 logger 回调桥接到封装好的 Hilog 接口:
/// 模拟鸿蒙 Hilog 底层桥接输出(实际项目中应替换为真实的 PlatformChannel 调用)
class HarmonyLogInterface {
static void info(
{required int domain, required String tag, required dynamic content}) {
debugPrint('[HILOG] DOMAIN:$domain TAG:$tag - $content');
}
}
final interceptorForHarmony = AwesomeDioInterceptor(
// 💡 技巧:不要打印到标准台,而是通过 logger 参数强行塞入鸿蒙底层特性的管道中。
logger: (logRawText) {
HarmonyLogInterface.info(
domain: 0x0111, // 指定网络专栏的领域码
tag: 'AWESOME_NET',
content: logRawText,
);
},
);
通过这种方式,控制台输出的每一行日志都会自动携带 [HILOG] DOMAIN:273 TAG:AWESOME_NET - 前缀,在 DevEco Studio 的 Log 面板中可以直接按 AWESOME_NET 标签过滤,实现网络日志与业务日志的彻底分离。

4.2 对于大型负载与超长文件上传接口屏蔽拦截隐患
当你在利用其特性开发类似大文件发送包功能时。
⚠️ 极其重要!这会严重拖慢主线程!因为将文件的二进制数打印为文本在终端解析会导致界面的卡死。针对大文件流切忌进行截取展示!
五、完整接入演练测试运行基板
这是一套随时可以用去接管并呈现出拦截特效的演练系统。
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:awesome_dio_interceptor/awesome_dio_interceptor.dart';
void main() => runApp(const NetworkInspectHarmonyApp());
class NetworkInspectHarmonyApp extends StatelessWidget {
const NetworkInspectHarmonyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MaterialApp(
title: '高护通道测试界面',
theme: ThemeData(primarySwatch: Colors.deepPurple),
home: const RestfulTesterScreen(),
);
}
}
class RestfulTesterScreen extends StatefulWidget {
const RestfulTesterScreen({Key? key}) : super(key: key);
_RestfulTesterScreenState createState() => _RestfulTesterScreenState();
}
class _RestfulTesterScreenState extends State<RestfulTesterScreen> {
late Dio _dioForHarmony;
String uiStatusTip = "日志全记录:请开启 IDE 终端侧边栏并点击发送...";
void initState() {
super.initState();
_dioForHarmony = Dio(BaseOptions(connectTimeout: const Duration(seconds: 5)));
// 接入极其抢眼的高亮边框打印组件装甲!
_dioForHarmony.interceptors.add(
AwesomeDioInterceptor(
logRequestTimeout: true,
logRequestHeaders: true,
logResponseHeaders: true,
logger: debugPrint, // 💡 鸿蒙必备:强制桥接到 debugPrint
),
);
}
void _dispatchFakeApi() async {
try {
await _dioForHarmony.post(
'https://uapis.cn/api/v1/misc/hotboard?type=weibo',
data: {
'title': '关于请求体的研究',
'body': '这是一篇极其深沉的文章',
'userId': 1992,
},
options: Options(headers: {'X-Harmony-Version': 'App-Beta-2.0'})
);
setState(() => uiStatusTip = "✅ 终端已输出震撼格式日志!");
} catch (e) {
setState(() => uiStatusTip = "❌ 请求阻断失败,请检查配置!");
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('极舒适网络调试流转')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(20),
child: Text(uiStatusTip, style: const TextStyle(fontSize: 16)),
),
const SizedBox(height: 30),
ElevatedButton(
onPressed: _dispatchFakeApi,
child: const Text('发送模拟请求'),
),
],
),
),
);
}
}

六、总结
在追求极简与效率当道的 OpenHarmony 开发时代。有时候你不想为了专门配环境代理抓包!awesome_dio_interceptor 提供了一种最为直接而简单的呈现方案,保卫了普通开发者排查极其烦扰的网络参数难题。让你的发包一目了然!
更多推荐




所有评论(0)