Flutter API生成插件shelf_open_api_generator的使用

Flutter API生成插件shelf_open_api_generator的使用

Shelf Open Api

这个库的目的是从你的shelf控制器生成带有开放API规范的文件。 OpenApi Specification

该库正在开发中,任何帮助都欢迎。

特性

  • ✅ Info (版本控制、端点和其他API信息)
  • ✅ Params (仅支持字符串类型的参数)
  • ✅ Requests
  • ✅ Responses
  • ❌ 错误响应
  • ✅ 通过$ref重用模式
  • ❌ 通过allOf, oneOf, anyOf, discriminator实现继承和多态
  • json_serializable 注解
  • [-] 安全性(部分实现)
  • ✅ 文档 (summary, description, example)
  • ✅ 标签/分组
  • ❌ 通过@Deprecated()元注解弃用操作
  • ❌ 默认值 default

安装包

要使用 shelf_open_api,你需要典型的 build_runner /代码生成设置。首先,将它们添加到你的pubspec.yaml文件中:

# pubspec.yaml
dependencies:
  shelf_open_api:

dev_dependencies:
  build_runner:
  shelf_open_api_generator:

使用方法

你可以在 example 文件夹中看到一些示例。

运行代码生成器,你可以使用以下命令:

  • <dart|flutter> pub run build_runner build

你可以在 public 文件夹中查看生成的结果!

完成!查看选项以获取更多信息/配置。 但是现在让我们来编写路由吧!

使用 OpenApiRoute 在需要定义查询类型或请求体类型的路由上。 记住,你可以为每个路由定义摘要和描述。 摘要是每个方法的第一行,并且必须只有一行,否则它将成为你的路由的描述。 JsonResponse 类可以在示例中找到。应该将其添加到 shelf_open_api 包吗?

class MessagesController {
  @Route.get('/messages')
  @OpenApiRoute(requestQuery: MessageFetchDto)
  Future<JsonResponse<void>> fetch(Request request) async {
    // 代码...
  }
  
  /// 这是一个摘要
  /// 
  /// 这是一个
  /// 长描述
  @Route.post('/messages')
  @OpenApiRoute(requestBody: MessageCreateDto)
  Future<JsonResponse<void>> create(Request request) async {
    // 代码...
  }
}

你也可以为你的查询或请求定义摘要、描述和示例。

class MessageCreateDto {
  /// 发送消息的聊天ID
  final String chatId;
  /// 消息内容。
  /// 
  /// 可以输入文本和表情符号。不支持图片。
  /// 
  /// `Hi, Luigi!`
  final String content;

  const MessageCreateDto({
    required this.chatId,
    required this.content,
  });
}

选项

你可以在 config 文件中找到许多其他配置参数。

targets:
  $default:
    builders:
      shelf_open_api_generator:
        options:
          include_routes_in: 'lib/**_controller.dart'
          info_title: 'Api'
          security_schemes:
             appwriteJwt:
               type: http
               scheme: Bearer
               bearerFormat: JWT

Shelf Routing

在你的应用中有太多的控制器?这可以为你节省时间!

使用 Routing 并创建一个包含应用中所有控制器的文件!

@Routing(
  varName: 'controllersRouter',
  generateFor: ['**/*_controller.dart'],
)
void main() {
  // ...
}

// *.g.dart

import 'package:shelf_router/shelf_router.dart';
import 'package:app/features/chats/controllers/chats_controller.dart';
import 'package:app/features/messages/controllers/messages_controller.dart';
import 'package:app/features/users/controllers/users_controller.dart';

final $controllersRouter = Router()
  ..mount('/v1', UsersController().router)
  ..mount('/v1', MessagesController().router)
  ..mount('/v1', ChatsController().router);

这允许你在控制器上添加 @Routes(prefix: '/v1') 来前缀所有控制器路由。 这个注解不是强制性的!

@Routes(prefix: '/v1')
class MessagesController {
  // ...
}

选项

targets:
  $default:
    builders:
      shelf_open_api_generator:shelf_routing:
        generate_for:
          - '**/*_api.dart'

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

1 回复

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


当然,下面是一个关于如何使用 shelf_open_api_generator 这个 Flutter API 生成插件的示例代码。这个插件可以帮助你根据 Dart 代码自动生成 OpenAPI (Swagger) 文档。

首先,你需要确保你的 pubspec.yaml 文件中已经添加了 shelf_open_api_generator 依赖。假设你已经有了一个 Dart 项目,并且想为你的 Shelf 服务器生成 OpenAPI 文档。

1. 添加依赖

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  shelf: ^1.0.0
  shelf_router: ^1.0.0
  shelf_open_api: ^3.0.0
  shelf_open_api_generator: ^2.0.0

2. 编写 Shelf 服务器代码

创建一个 server.dart 文件,并编写一个简单的 Shelf 服务器代码。例如:

import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_open_api/shelf_open_api.dart';
import 'package:shelf_open_api_generator/shelf_open_api_generator.dart';

part 'routes.dart'; // 这里我们将定义路由

void main() async {
  final router = Router();

  // 注册路由
  setupRouter(router);

  // 生成 OpenAPI 文档
  final openApiDocument = generateOpenApiDocument(
    info: Info(title: 'My API', version: '1.0.0'),
    paths: {
      '/': getOperation(summary: 'Root endpoint', responses: {200: ResponseObject(description: 'OK')}),
      '/hello': getOperation(
        summary: 'Say hello',
        operationId: 'hello',
        responses: {200: ResponseObject(description: 'Hello response', content: {'application/json': {'schema': Schema.object({'message': Schema.string()})}})},
      ),
    },
    components: Components(schemas: {
      'HelloResponse': Schema.object({'message': Schema.string()}),
    }),
  );

  // 创建 OpenAPI 处理器
  final openApiHandler = createOpenApiHandler(openApiDocument);

  // 创建 Shelf 处理器
  final handler = Pipeline().addMiddleware(logRequests()).addHandler(
    Router()
      ..addRoute(Method.get, '/openapi.json', openApiHandler) // OpenAPI 文档路径
      ..addAll(router.routes),
  );

  final server = await HttpServer.bind(InternetAddress.anyIPv4, 8080);
  print('Serving at http://${server.address.host}:${server.port}');
  await server.listen(handler.handleRequest);
}

3. 定义路由

创建一个 routes.dart 文件,并定义你的路由处理逻辑:

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';

void setupRouter(Router router) {
  router.get('/hello', (Request request) async {
    return Response.json({'message': 'Hello, World!'});
  });

  router.get('/', (Request request) async {
    return Response.ok('Welcome to the root of my API!');
  });
}

4. 运行服务器

在终端中运行以下命令来启动你的服务器:

dart run

现在,你的服务器应该正在运行,并且你可以访问 http://localhost:8080/openapi.json 来查看自动生成的 OpenAPI 文档。

总结

以上代码展示了如何使用 shelf_open_api_generator 来为你的 Shelf 服务器自动生成 OpenAPI 文档。你可以根据需要扩展和修改生成的 OpenAPI 文档和路由处理逻辑。这个插件可以大大简化 API 文档的管理工作,使你的 API 更加易于理解和使用。

回到顶部