Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做?

  1. 对着文档,手写 Dart Model 类(容易写错字段类型)。
  2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。
  3. 当后端修改了字段名,你对着报错修半天。

这是重复劳动的地狱。

swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括:

  • Model 类:支持 json_serializable,带 fromJson/toJson
  • Service 类:基于 chopperdio 的请求方法。
  • Enum:枚举类型的自动映射。

对于 OpenHarmony 应用开发,这种自动化工具能极大减少与后端对接的沟通成本和代码错误率。

一、核心工作流

该插件作为 build_runner 的一部分运行。

  1. Config: 在 build.yamlpubspec.yaml 中配置 Swagger 源文件位置。
  2. Fetch/Read: 读取本地或远程的 Swagger 文件。
  3. Generate: 生成 .swagger.dart, .models.swagger.dart, .enums.swagger.dart
  4. Integration: 在业务代码中直接调用生成的方法。

输入

生成

生成

生成

调用

Http 请求

swagger.json

swagger_dart_code_generator

User, Product 模型

RestClient (Dio/Chopper)

Status枚举

OpenHarmony 应用

Server

二、集成与用法详解

2.1 添加依赖

我们需要生成器和运行时库。

dependencies:flutter:sdk: flutter json_annotation: ^4.8.0 chopper: ^7.0.0 # 或者 diodev_dependencies:build_runner: ^2.4.0 swagger_dart_code_generator: ^4.1.1 json_serializable: ^6.7.0 chopper_generator: ^7.0.0 

2.2 配置 build.yaml

在项目根目录创建 build.yaml,告诉生成器去哪里找 Swagger 文件。

targets:$default:builders:swagger_dart_code_generator:options:input_folder:"lib/api_docs/"# 存放 json 的目录output_folder:"lib/api_gen/"# 生成代码的目录# 使用 chopper 还是 dio? 默认是 chopper,dio 需要额外配置use_generator: chopper 

2.3 下载 Swagger 文件

将后端的 swagger.json 下载到 lib/api_docs/myservice.swagger.json

2.4 运行生成

flutter pub run build_runner build 

生成完毕后,你会在 lib/api_gen/ 下看到 myservice.swagger.dart 等文件。

2.5 使用生成的代码

import'package:chopper/chopper.dart';import'lib/api_gen/myservice.swagger.dart';voidmain()async{// 1. 创建 Servicefinal service =Myservice.create(ChopperClient( baseUrl:Uri.parse('https://api.example.com'), converter: $JsonSerializableConverter(),));// 2. 调用 APIfinal response =await service.getUser(id:123);if(response.isSuccessful){// 3. 直接获得强类型的 User 对象finalUser? user = response.body;print(user?.name);}}
在这里插入图片描述

三、OpenHarmony 适配与实战:解决构建与兼容性

3.1 鸿蒙网络库选择

生成的代码通常依赖 chopperdio

  • Chopper: 基于 http 包。在纯 Dart 环境和 Flutter Mobile 上表现良好。
  • Dio: 功能更强大(拦截器、下载进度)。

适配建议
在 OpenHarmony 上,两者都能工作。但如果你需要利用鸿蒙特有的网络配置(如安全证书锁定),推荐使用 Dio 模式,因为你可以更方便地拿到底层的 HttpClientAdapter 进行定制(如替换为 dio_http2_adapter 或自定义 adapter)。

修改 build.yaml 切换到 Dio:

swagger_dart_code_generator:options:use_generator: dio 

3.2 解决文件名冲突

有时后端的 Swagger 定义里会有 PageList 这种通用类名,与 Flutter 冲突。
可以在配置中进行重命名映射。

options:replacement_rules:-pattern:"^Page$"replacement:"ApiPage"

3.3 CI/CD 集成

在鸿蒙工程的 CI 流水线中,建议:

  1. 不提交生成代码:将 lib/api_gen/ 加入 .gitignore
  2. 构建时生成:在 CI 脚本中先执行 curl 下载最新 Swagger JSON,再执行 build_runner。这样能确保 App 始终与后端接口保持一致(如果不一致构建会挂)。

四、功能详解:自定义模版

如果默认生成的代码风格不符合团队规范,该插件支持自定义模板。但这通常比较复杂。更简单的方式是利用 include_if_null 等选项微调 JSON 序列化行为。

五、总结

swagger_dart_code_generator 是“契约优先”开发模式的最佳实践工具。它让 API 接口定义成为真理来源(Source of Truth)。

对于 OpenHarmony 开发者:

  • 减少手写:让你从繁琐的 JSON 解析中解放出来,专注于鸿蒙 UI 和交互逻辑。
  • 类型安全:所有字段都是类型安全的,再也不用担心 String 传成 int

最佳实践

  1. 版本控制:虽然建议不提交生成文件,但必须提交 Swagger JSON 文件,以便回溯历史接口变更。
  2. Review 变更:每次后端更新接口后,重新生成代码,利用 Git Diff 查看变动,这有助于前端提前发现潜在的 Breaking Change。

六、完整实战示例

import'package:chopper/chopper.dart';// 假设这是 build_runner 生成的文件// import 'lib/api_gen/my_service.swagger.dart';/* 假定生成的 Service 类定义如下 (由库自动生成): @ChopperApi() abstract class MyService extends ChopperService { @Get(path: '/users/{id}') Future<Response<User>> getUser(@Path('id') int id); static MyService create([ChopperClient? client]) => _$MyService(client); } */classApiManager{ late finalMyService _service;// 使用 dynamic 或生成的类型// 单例模式staticfinalApiManager _instance =ApiManager._internal();factoryApiManager()=> _instance;ApiManager._internal(){// 初始化 Chopper 客户端final chopper =ChopperClient( baseUrl:Uri.parse('https://api.example.com'), converter:JsonConverter(),// 这里通常用 generated $JsonSerializableConverter errorConverter:JsonConverter(), services:[// 注册生成的服务// MyService.create(),], interceptors:[// HttpLoggingInterceptor(), // 日志拦截器]);// 获取服务实例// _service = chopper.getService<MyService>();}Future<void>fetchUser(int id)async{try{/* // 业务调用非常清爽,完全感知不到 HTTP 细节 final response = await _service.getUser(id: id); if (response.isSuccessful) { // body 是强类型的 User 对象 print('User Name: ${response.body?.name}'); } else { print('API Error: ${response.error}'); } */print('API Call (Simulated)');}catch(e){print('Network Exception: $e');}}}voidmain(){ApiManager().fetchUser(1001);}
在这里插入图片描述

Read more

最全java面试题及答案(208道)

最全java面试题及答案(208道)

本文分为十九个模块,分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ,如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 Java 基础 1. JDK 和 JRE 有什么区别? * JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java

By Ne0inhk
10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 * 一、引言 * 云计算平台概览 * ToDesk云电脑:随时随地用上高性能电脑 * 二 .云电脑初体验 * DeekSeek介绍 * 版本参数与特点 * 任务类型表现 * 1、ToDesk云电脑 * 2、顺网云电脑 * 3、海马云电脑 * 三、DeekSeek本地化实操和AIGC应用 * 1. ToDesk云电脑 * 2. 海马云电脑 * 3、顺网云电脑 * 四、结语 * 总结:云电脑如何选择? 一、引言 DeepSeek这些大模型让 AI 开发变得越来越有趣,但真要跑起来,可没那么简单! * 本地配置太麻烦:显卡不够、驱动难装、环境冲突,光是折腾这些就让人心态崩了。 * 云端性能参差不齐:选错云电脑,可能卡到爆、加载慢,还容易掉线,搞得效率直线下降。 * 成本难控:有的平台按小时计费,价格一会儿一个样,

By Ne0inhk
用 DeepSeek 打造你的超强代码助手

用 DeepSeek 打造你的超强代码助手

DeepSeek Engineer 是啥? 简单来说,DeepSeek Engineer 是一个基于命令行的智能助手。它能帮你完成这些事: * 快速读文件内容:比如你有个配置文件,直接用命令把它加载进助手,后续所有操作都可以基于这个文件。 * 自动改文件:它不仅能提建议,还可以直接生成差异表(diff),甚至自动应用修改。 * 智能代码生成:比如你让它生成代码片段,它会按照指定格式和规则直接返回。 更重要的是,这一切都是通过 DeepSeek 的强大 API 来实现的。想象一下,你有个贴身助手,不仅能听懂你的代码需求,还能直接动手帮你写! 核心功能拆解 我们先来看 DeepSeek Engineer 的几个核心能力,让你更好地理解它的强大之处。 1. 自动配置 DeepSeek 客户端 启动这个工具时,你只需要准备一个 .env 文件,里面写上你的 API Key,比如: DEEPSEEK_API_

By Ne0inhk
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操作系统 2、镜像准备 三、安装 1、安装Docker 2、启动Ollama 3、拉取Deepseek大模型 4、启动Deepseek  一、引言 1、什么是Docker Docker:就像一个“打包好的App” 想象一下,你写了一个很棒的程序,在自己的电脑上运行得很好。但当你把它发给别人,可能会遇到各种问题: * “这个软件需要 Python 3.8,但我只有 Python 3.6!

By Ne0inhk