swagger_generator_flutter/README.md

8.2 KiB
Raw Blame History

XY Swagger Generator

基于 Swagger/OpenAPI 的 Dart/Flutter API/模型代码生成工具。

Dart Flutter OpenAPI

功能特性

🚀 核心功能

  • 完整的 OpenAPI 3.0 支持:涵盖所有主要规范特性
  • 高性能解析:支持并行解析和流式处理大型文档
  • 智能代码生成:生成高质量的 Dart/Flutter 代码
  • 模块化架构:按 API 模块自动分组生成

🎯 专为 Flutter 优化

  • Dio + Retrofit 集成:完美适配主流网络架构
  • 类型安全:生成强类型的 API 接口和模型
  • JSON 序列化:自动生成 json_serializable 代码
  • 文件上传支持:完整的 multipart/form-data 支持

🔧 高级特性

  • 智能缓存:提升重复操作性能
  • 错误诊断:详细的错误报告和修复建议
  • 性能监控:内置性能统计和优化
  • 增量生成:支持增量更新和变更检测

📚 文档和规范

核心文档

设计原则

  1. OpenAPI 3.0 标准优先 - 严格遵循规范,不进行主观推断
  2. 与服务器保持一致 - swagger.json 是唯一真实来源
  3. 有问题沟通文档 - 发现问题时要求完善后端文档
  4. 类型安全第一 - 生成强类型代码,避免运行时错误

🚀 快速开始

1. 安装依赖

flutter pub get

2. 基础用法(命令行)

# 生成模型和API推荐
sh run_swagger.sh all

# 分别生成
sh run_swagger.sh api     # 只生成 API
sh run_swagger.sh models  # 只生成模型

# 或直接使用 dart 命令
dart run bin/main.dart generate --models --api

3. 编程式用法(推荐)

import 'package:swagger_generator_flutter/swagger_generator_flutter.dart';

void main() async {
  // 使用高性能解析器
  final parser = PerformanceParser(
    config: ParseConfig(
      enablePerformanceStats: true,
      enableParallelParsing: true,
    ),
  );

  // 解析 OpenAPI 文档
  final jsonString = await File('swagger.json').readAsString();
  final document = await parser.parseDocument(jsonString);

  // 使用优化生成器
  final generator = OptimizedRetrofitGenerator(
    className: 'ApiService',
    generateModularApis: true,
    generateBaseResult: true,
    generatePagination: true,
    generateFileUpload: true,
  );

  // 生成代码
  final generatedCode = generator.generateFromDocument(document);

  // 保存文件
  await File('lib/api/api_service.dart').writeAsString(generatedCode);

  // 查看性能统计
  final stats = parser.lastStats;
  print('解析时间: ${stats?.totalTime.inMilliseconds}ms');
  print('生成的路径数: ${stats?.pathCount}');
}

📖 详细配置

生成器类型

1. RetrofitApiGenerator基础版

final generator = RetrofitApiGenerator(
  className: 'ApiService',        // 生成的类名
  splitByTags: true,             // 是否按标签分割(默认启用)
  useRetrofit: true,             // 使用 Retrofit 注解
  generateModels: true,          // 生成模型类
);

2. OptimizedRetrofitGenerator推荐

final generator = OptimizedRetrofitGenerator(
  className: 'ApiService',
  generateModularApis: true,     // 模块化 API
  generateBaseResult: true,      // 基础响应类型
  generatePagination: true,      // 分页支持
  generateFileUpload: true,      // 文件上传
  baseResultType: 'BaseResult',  // 自定义基础类型
  pageResultType: 'PageResult',  // 自定义分页类型
);

3. PerformanceGenerator高性能

final generator = PerformanceGenerator(
  maxConcurrency: 4,             // 最大并发数
  enableCaching: true,           // 启用缓存
  enableIncremental: true,       // 增量生成
  enableParallel: true,          // 并行生成
);

解析器配置

final parser = PerformanceParser(
  config: ParseConfig(
    enableParallelParsing: true,   // 并行解析
    enableStreamParsing: false,    // 流式解析
    enableCaching: true,           // 缓存
    maxConcurrency: 4,             // 最大并发数
    enablePerformanceStats: true,  // 性能统计
  ),
);

验证和错误处理

// 创建验证器
final validator = EnhancedValidator(
  strictMode: false,             // 严格模式
  includeWarnings: true,         // 包含警告
);

// 验证文档
final isValid = validator.validateDocument(document);

// 获取错误报告
final errorReport = validator.errorReporter.generateReport();
print(errorReport);

📊 性能优化

缓存策略

// 配置智能缓存
final cache = SmartCache<String>(
  maxSize: 1000,                 // 最大缓存大小
  strategy: CacheStrategy.smart, // 缓存策略
  defaultTtl: Duration(hours: 1), // 默认过期时间
);

// 获取缓存统计
final stats = cache.getStats();
print('缓存命中率: ${(stats.hitRate * 100).toStringAsFixed(1)}%');

性能监控

// 获取解析性能统计
final parseStats = parser.lastStats;
print('解析性能统计:');
print('  总时间: ${parseStats?.totalTime.inMilliseconds}ms');
print('  路径数: ${parseStats?.pathCount}');
print('  吞吐量: ${parseStats?.bytesPerSecond.toStringAsFixed(2)} bytes/s');

📁 目录结构

swagger_generator_flutter/
  bin/                # 命令行入口
  example/            # 使用示例
  generator/          # 生成的 API、模型、文档
  lib/                # 生成器核心代码
    core/             # 核心模型和解析器
    generators/       # 代码生成器
    validators/       # 文档验证器
  tests/              # 单元测试和集成测试
  swagger.json        # OpenAPI 源文件

运行测试

dart run test tests/

🎯 规范遵循示例

正确的生成结果

// 严格按照 swagger.json 定义生成
@POST('/api/v1/Login/userLogin')
Future<BaseResult<UserLoginResult>> userLogin(
  @Body() LoginRequest request  // 仅当 swagger 中明确定义时
);

// 健康检查接口
@GET('/health')
Future<BaseResult<void>> healthCheck();

// 无明确 schema 的接口
@POST('/api/v1/Action/DoSomething')
Future<BaseResult<Map<String, dynamic>>> doSomething();

避免的错误做法

// 错误:生成不存在的类型
Future<BaseResult<TaskInfoResult>> someMethod();

// 错误:添加 swagger 中未定义的参数
@POST('/api/v1/GetUsers')
Future<BaseResult<List<User>>> getUsers(
  @Body() Map<String, dynamic> request  // swagger 中没有定义
);

// 错误:基于关键词推断类型
if (path.contains('login')) return 'UserLoginResult';

贡献指南

  • 严格遵循 代码生成规范
  • 使用 代码审查清单 进行质量检查
  • 代码需包含中英文注释
  • 新增功能请补充对应测试用例
  • 生成规则/命名风格如有特殊需求请在 issue 说明

常见问题

  • 生成的类型不存在? 检查 swagger.json 中是否定义了对应的 schema
  • 接口缺少参数? 确认 swagger.json 中是否有完整的参数定义
  • 可空性不正确? 检查 swagger.json 中的 nullable 字段设置
  • 更多问题请参考 快速参考指南

脚本命令说明

Linux/macOS (run_swagger.sh)

# 显示帮助
./run_swagger.sh help

# 只生成数据模型
./run_swagger.sh models

# 只生成API文档
./run_swagger.sh docs

# 只生成Retrofit API
./run_swagger.sh api

Windows (run_swagger.bat)

# 显示帮助
run_swagger.bat help

# 只生成数据模型
run_swagger.bat models

# 只生成API文档
run_swagger.bat docs

# 只生成Retrofit API
run_swagger.bat api

更新日期2025-07-13
作者Max