Flutter OpenAPI集成插件openapi_dart_common的使用
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
更多关于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项目中使用它的示例:
- 导入生成的API客户端
import 'package:your_project/generated/api.dart'; // 替换为你的实际路径
- 配置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));
}
- 在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规范发生变化,你可能需要重新生成代码。