Flutter Swagger代码生成插件swagger_dart_code_generator的使用
Flutter Swagger代码生成插件 swagger_dart_code_generator 的使用
📣 构建 Dart 类型从 Swagger/OpenAPI 模式 📣
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 生成。
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 | 如果需要减少应用程序大小,您可以禁用生成 hashcode 和 Equals 方法。 |
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
更多关于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');
}
}
请注意,上述代码示例中的类和方法名(如DefaultApiClient
、PetsApi
、listPets
)可能会根据你的Swagger文件内容有所不同。
6. 注意事项
- 确保你的Swagger文件是有效的,并且符合OpenAPI规范。
- 如果你的Swagger文件很大或很复杂,生成的代码可能会很多,需要仔细管理。
- 生成的代码是静态的,如果Swagger文件发生变化,你需要重新生成代码。
希望这个指南能帮助你在Flutter项目中成功使用swagger_dart_code_generator
插件!