Flutter OpenAPI集成插件openapi_dart_common的使用

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

Flutter OpenAPI集成插件openapi_dart_common的使用

简介

openapi_dart_common 是一个用于 Dart 客户端代码生成器的核心可重用库。它允许你从 OpenAPI 文件生成一个单一的客户端库,并在多个客户端中重用,例如 Flutter Web(浏览器)、Flutter 和 Dart CLI(如使用 Ogurets 进行端到端测试)。

如何使用

1. 添加依赖项

首先,在你的 pubspec.yaml 文件中添加 openapi_dart_common 和你生成的库依赖项:

dependencies:
  openapi_dart_common: ^3.2.1 
  your_generated_lib:
    path: ../your_generated_lib
2. 初始化 ApiClient

每个生成的服务都需要一个 ApiClient 实例。从版本 2.0 开始,我们已经切换到使用 Dio,它会自动处理浏览器和 CLI 的差异。因此,通常情况下你只需要指定 DioClientDelegate(),除非你需要覆盖 Dio 实例(例如提供额外的选项等)。

import 'package:openapi_dart_common/openapi.dart';
import 'package:dio/dio.dart';

void main() {
  // 创建 ApiClient 实例
  final _apiClient = ApiClient(
    basePath: "http://localhost:8903",  // API 的基础路径
    apiClientDelegate: DioClientDelegate(),  // 使用 DioClientDelegate
  );

  // 使用生成的服务
  final _personService = PersonServiceApi(_apiClient);

  // 调用服务方法
  _personService.getPerson(1).then((person) {
    print('Person: ${person.name}');
  }).catchError((error) {
    print('Error: $error');
  });
}
3. 自定义 BaseClient

如果你需要自定义 BaseClient,可以传递一个自定义的 BaseClient 实例给 ApiClient。但请注意,不要混合使用需要 dart:html(仅存在于浏览器中)和 dart:io(其他所有平台)的实现。

import 'package:openapi_dart_common/openapi.dart';
import 'package:dio/dio.dart';

class CustomClientDelegate extends DioClientDelegate {
  @override
  Dio createDioClient() {
    final dio = super.createDioClient();
    dio.options.connectTimeout = 5000;  // 设置连接超时时间
    dio.interceptors.add(LogInterceptor());  // 添加日志拦截器
    return dio;
  }
}

void main() {
  final _apiClient = ApiClient(
    basePath: "http://localhost:8903",
    apiClientDelegate: CustomClientDelegate(),
  );

  final _personService = PersonServiceApi(_apiClient);

  _personService.getPerson(1).then((person) {
    print('Person: ${person.name}');
  }).catchError((error) {
    print('Error: $error');
  });
}

Maven 配置

如果你没有安装 Maven,可以在 Linux 和 Mac 上通过包管理器(如 Homebrew)轻松安装。Maven 需要一个 JDK 实现,可以从 AdoptOpenJDK 获取。或者,你也可以使用 Docker 来运行 Maven。

完整示例 Demo

以下是一个完整的 Flutter 示例项目,展示了如何集成 openapi_dart_common 并使用生成的 API 服务。

1. 项目结构
flutter_openapi_demo/
├── lib/
│   ├── main.dart
│   └── services/
│       └── person_service.dart
├── pubspec.yaml
└── your_generated_lib/
    └── (生成的 API 代码)
2. pubspec.yaml
name: flutter_openapi_demo
description: A demo project for integrating openapi_dart_common in Flutter.

dependencies:
  flutter:
    sdk: flutter
  openapi_dart_common: ^3.2.1
  your_generated_lib:
    path: ../your_generated_lib
  dio: ^4.0.0
3. main.dart
import 'package:flutter/material.dart';
import 'package:openapi_dart_common/openapi.dart';
import 'package:dio/dio.dart';
import 'services/person_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter OpenAPI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PersonListScreen(),
    );
  }
}

class PersonListScreen extends StatefulWidget {
  @override
  _PersonListScreenState createState() => _PersonListScreenState();
}

class _PersonListScreenState extends State<PersonListScreen> {
  List<Person> _persons = [];

  @override
  void initState() {
    super.initState();
    _fetchPersons();
  }

  void _fetchPersons() async {
    try {
      final persons = await PersonService().getPersons();
      setState(() {
        _persons = persons;
      });
    } catch (e) {
      print('Error fetching persons: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Person List'),
      ),
      body: ListView.builder(
        itemCount: _persons.length,
        itemBuilder: (context, index) {
          final person = _persons[index];
          return ListTile(
            title: Text(person.name),
            subtitle: Text('ID: ${person.id}'),
          );
        },
      ),
    );
  }
}
4. services/person_service.dart
import 'package:openapi_dart_common/openapi.dart';
import 'package:dio/dio.dart';
import 'package:your_generated_lib/person_service_api.dart';  // 生成的 API 服务

class PersonService {
  final _apiClient = ApiClient(
    basePath: "http://localhost:8903",
    apiClientDelegate: DioClientDelegate(),
  );

  final _personService = PersonServiceApi(_apiClient);

  Future<List<Person>> getPersons() async {
    final response = await _personService.getPersons();
    return response.data;
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成并使用openapi_dart_common插件的示例代码。这个插件通常用于与OpenAPI(也称为Swagger)定义的API进行交互。

首先,确保你已经在pubspec.yaml文件中添加了openapi_dart_common依赖:

dependencies:
  flutter:
    sdk: flutter
  openapi_dart_common: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

接下来,假设你有一个OpenAPI规范文件(通常是一个JSON或YAML文件),你可以使用它来生成Dart代码。这通常是通过命令行工具或脚本完成的,但在这里我们假设你已经有了生成的Dart文件。

假设你的OpenAPI规范生成了一个名为api.dart的文件,其中包含了API客户端和相关的数据模型。以下是如何在Flutter项目中使用它的示例:

  1. 导入生成的API客户端
import 'package:your_project/generated/api.dart';  // 替换为你的实际路径
  1. 配置API客户端
void main() {
  // 初始化API客户端(假设你的API需要API密钥)
  final apiClient = ApiClient()
    ..basePath = 'https://your-api-base-path.com/v1'  // 替换为你的API基础路径
    ..addDefaultHeader('Authorization', 'Bearer YOUR_ACCESS_TOKEN');  // 如果需要API密钥,请替换YOUR_ACCESS_TOKEN

  // 使用ApiClient实例创建API服务
  final petApi = PetApi(apiClient);  // 假设有一个名为PetApi的服务,根据你的OpenAPI规范生成

  runApp(MyApp(petApi: petApi));
}
  1. 在Flutter应用中使用API服务
import 'package:flutter/material.dart';
import 'package:your_project/generated/api.dart';  // 替换为你的实际路径

class MyApp extends StatelessWidget {
  final PetApi petApi;

  MyApp({required this.petApi});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter OpenAPI Integration'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 调用API方法,例如获取宠物列表
              try {
                final List<Pet> pets = await petApi.listPets();
                // 处理返回的数据,例如显示在一个列表中
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Fetched ${pets.length} pets')),
                );
              } catch (e) {
                // 处理错误
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Error: ${e.message}')),
                );
              }
            },
            child: Text('Get Pets'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击按钮时会调用OpenAPI客户端生成的listPets方法来获取宠物列表,并在SnackBar中显示结果或错误信息。

请注意,openapi_dart_common本身通常不直接用于API调用,而是作为生成代码的基础库。实际使用中,你会通过OpenAPI Generator等工具从OpenAPI规范文件生成Dart代码,然后在Flutter项目中导入并使用这些生成的代码。

此外,确保你已经正确配置了OpenAPI规范文件,并且生成的代码与你的API规范相匹配。如果API规范发生变化,你可能需要重新生成代码。

回到顶部