Flutter Swagger代码生成插件swagger_dart_code_generator的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter Swagger代码生成插件 swagger_dart_code_generator 的使用

📣 构建 Dart 类型从 Swagger/OpenAPI 模式 📣

Swagger dart code generator

pub package GitHub issues GitHub last commit build codecov Discord

SwaggerDartCodeGenerator 是一个代码生成器,它查找 *.swagger 文件并基于模式构建 .swagger.dart 文件。代码生成基于 Chopper 和 JsonAnnotation 模型,并可以根据需要进行配置。

Overview

通常情况下,对于每个 .swagger 文件将创建三个输出:

  • .dart:由 Swagger dart code generator 生成,包含所有模型、请求、转换器等。
  • .enums.dart(自 v1.2.0):由 Swagger dart code generator 生成,包含所有枚举和枚举映射。
  • .chopper.dart:由 chopper 生成。
  • .g.dart:由 json_serializable 生成。

Bloc

Installation

生成的代码在运行时使用以下包:

dependencies:
  chopper: ^8.0.0
  json_annotation: ^4.8.0

为了能够进行代码生成,请将以下内容添加到您的 pubspec.yaml 文件中:

dev_dependencies:
  build_runner: ^2.3.3
  chopper_generator: ^8.0.0
  json_serializable: ^6.6.1
  swagger_dart_code_generator: ^2.10.4

然后运行:

dart pub get

flutter pub get

现在通过运行以下命令,SwaggerGenerator 将为您生成 API 文件:

dart run build_runner build

Configuration

Swagger 生成器提供了一些配置选项来生成代码。所有选项都应包含在项目根目录下的 build.yaml 文件中:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          # 自定义配置选项!

配置选项

Option Default value Is required Description
input_folder - true 路径指向包含 .swagger 文件的文件夹(例如 swagger_examples 或 lib/swaggers)。
output_folder - true 输出文件夹路径(例如 lib/generated)。
input_urls [] false 在这里可以提及要从互联网下载的文件列表。您可以查看 示例 使用。
with_base_url true false 如果此选项为 false,则生成器将忽略 swagger 文件中的 base url。
use_required_attribute_for_headers true false 如果此选项为 false,则生成器不会向头信息添加 @required 属性。
with_converter true false 如果选项为 true,则生成所有映射的组合。
ignore_headers false false 如果选项为 true,则不会生成头信息。
additional_headers false false 未在 Swagger 中指定的附加头信息列表。示例用法:build.yaml
enums_case_sensitive true false 如果值为 false,则 ‘enumValue’ 将被定义为 Enum.enumValue,即使其 JSON 键等于 ‘ENUMVALUE’。
include_paths [] false 列表
exclude_paths [] false 列表
classes_with_nullabe_lists [] false 正则表达式字符串列表。如果类名匹配任何正则表达式,则列表属性将具有默认值 null。否则它将是空列表。如果您使用了 use_default_null_for_lists: true,只需设置 .* 值,结果将相同。详情请参阅 示例
build_only_models false false 如果选项为 true,则不会生成 Chopper 类。
separate_models false false 如果选项为 true,则将模型生成到单独的文件中。
include_if_null null false 设置 includeIfNull JsonAnnotation 特性和为其设置值。如果为 null,则不设置任何内容。
default_values_map [] false 包含类型及其默认值的映射。详见 DefaultValueMap
response_override_value_map [] false 包含响应及其覆盖值的映射。详见 ResponseOverrideValueMap
cut_from_model_names - false 如果您的模型名称很长且包含很多重复单词,例如 DbUsersModelsV3GeneralUserModel,您可以使用 cut_from_model_names : DbUsersModelsV3 切掉重复部分。您还可以在此参数中使用正则表达式。
nullable_models - false 应具有强制可空属性的模型名称列表。用法示例在 build.yaml 中。
override_equals_and_hashcode - true 如果需要减少应用程序大小,您可以禁用生成 hashcodeEquals 方法。
overriden_models - false 手动编写将替换生成模型的模型列表。可以针对每个文件不同。详见 Overriden Models Implementation
use_path_for_request_names true false 只有当所有请求具有唯一的 operationId 时,才可以为 false。这为请求提供了可读的名称。
add_base_path_to_requests false false 将 swagger 基本路径添加到所有请求路径。
multipart_file_type List<int> false 允许覆盖 multipart 请求输入参数的生成类(见 #605)。
override_to_string bool true 使用 jsonEncode(this) 覆盖 toString() 方法。
generate_first_succeed_response true false 如果请求有多个成功响应,则只生成第一个。否则为 dynamic
scalars - {} 用于给定 格式 的字符串属性的自定义类型的映射。详见 Scalars Implementation

重要的是要记住,默认情况下,build 将遵循 Dart 的包布局约定,这意味着只有某些文件夹会被考虑解析输入文件。因此,如果您想引用其他文件夹中的文件,请确保您已在 sources 中包含了它:

targets:
  $default:
    sources:
      - lib/**
      - swagger_examples/**
      - swaggers/**

Default Value Map for Model Generation

如果您希望为特定类型的字段添加 defaultValue: 属性,可以使用默认值映射。请参阅以下示例:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          input_folder: 'lib/swaggers'
          output_folder: 'lib/generated_code/'
          default_values_map:
            - type_name: int
              default_value: '36'
            - type_name: String
              default_value: 'default'
            - type_name: 'List<String>'
              default_value: '[]'
          exclude_paths:
            - '/cars/get'
          include_paths:
            - '/popular/cars'

Overriden Models Implementation

      swagger_dart_code_generator:
        options:
          input_folder: "input_folder/"
          output_folder: "lib/swagger_generated_code/"
          overriden_models:
            - file_name: "pet_service_json"
              import_url: "../overriden_models.dart"
              overriden_models:
                - "Pet"
                - "Order"
            - file_name: "pet_service_swagger"
              import_url: "../overriden_models_another.dart"
              overriden_models:
                - "Result"

Scalars Implementation

      swagger_dart_code_generator:
        options:
          input_folder: "input_folder/"
          output_folder: "lib/swagger_generated_code/"
          import_paths:
            - "package:uuid/uuid.dart"
          scalars:
            uuid:
              type: Uuid
              deserialize: Uuid.parse
              # 可选 - 默认是 toString()
              serialize: myCustomUuidSerializeFunction

Response Override Value Map for Requests Generation

如果您希望覆盖特定请求的响应,可以使用 response_override_value_map。例如:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          input_folder: 'lib/swaggers'
          output_folder: 'lib/generated_code/'
          response_override_value_map:
            - url: '/store/inventory'
              method: get
              overridden_value: 'List<dynamic>'
            - url: '/news/latest'
              method: put
              overridden_value: 'MyPerfectType'

检查 示例 以详细了解如何使用它。

示例代码

import 'package:example/swagger_generated_code/pet_service_yaml.swagger.dart';

void main() async {
  final petsApi = PetServiceYaml.create();

  final postResult = await petsApi.petPost(
    body: Pet(
      name: 'Vovanella',
      photoUrls: [
        'https://i.ytimg.com/vi/hO6G8jxV-YU/maxresdefault.jpg',
        'https://i.ytimg.com/vi/5u3iv8AT8G8/maxresdefault.jpg'
      ],
      status: PetStatus.available,
      category: Category(),
    ),
  );

  final pet = Pet.fromJson(postResult.body as Map<String, dynamic>);

  print('Created pet id: ${pet.id}');
}

以上是 swagger_dart_code_generator 插件的详细使用说明,希望对您有所帮助!


更多关于Flutter Swagger代码生成插件swagger_dart_code_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Swagger代码生成插件swagger_dart_code_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用swagger_dart_code_generator插件来生成代码的详细指南,包括相关代码案例。

1. 安装插件

首先,你需要将swagger_dart_code_generator添加到你的Flutter项目中。在你的pubspec.yaml文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖项...

dev_dependencies:
  build_runner: ^2.0.4  # 或者最新版本
  swagger_dart_code_generator: ^x.y.z  # 替换为最新版本号

然后运行以下命令来安装依赖项:

flutter pub get

2. 配置build.yaml

接下来,在你的项目根目录下创建一个build.yaml文件,并添加以下配置来指定swagger_dart_code_generator的输入和输出:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        enabled: true
        generate_for:
          - "path/to/your/swagger.yaml"  # 替换为你的Swagger文件路径
        options:
          output: "lib/generated/api_client"  # 生成代码的目录

3. 编写Swagger YAML文件

确保你的Swagger YAML文件(例如swagger.yaml)是有效的,并且包含了API的完整定义。例如:

openapi: 3.0.0
info:
  title: Sample API
  version: 1.0.0
paths:
  /pets:
    get:
      summary: List all pets
      responses:
        '200':
          description: A list of pets.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        tag:
          type: string

4. 生成代码

现在你可以使用build_runner来生成代码:

flutter pub run build_runner build

如果一切正常,swagger_dart_code_generator会根据你的Swagger文件在指定的输出目录(例如lib/generated/api_client)中生成API客户端代码。

5. 使用生成的代码

在你的Flutter项目中,你可以导入生成的API客户端代码并使用它。例如:

import 'package:your_project_name/generated/api_client/api.dart';  // 根据实际路径调整

void main() async {
  final apiClient = DefaultApiClient();  // 根据生成的代码调整
  final petsApi = PetsApi(apiClient);  // 假设生成了一个名为PetsApi的类

  try {
    final pets = await petsApi.listPets();
    print('Pets: ${pets.map((pet) => pet.name).join(', ')}');
  } catch (e) {
    print('Error: $e');
  }
}

请注意,上述代码示例中的类和方法名(如DefaultApiClientPetsApilistPets)可能会根据你的Swagger文件内容有所不同。

6. 注意事项

  • 确保你的Swagger文件是有效的,并且符合OpenAPI规范。
  • 如果你的Swagger文件很大或很复杂,生成的代码可能会很多,需要仔细管理。
  • 生成的代码是静态的,如果Swagger文件发生变化,你需要重新生成代码。

希望这个指南能帮助你在Flutter项目中成功使用swagger_dart_code_generator插件!

回到顶部