Flutter网络请求插件simple_rest_service的使用
Flutter网络请求插件simple_rest_service的使用
简介
simple_rest_service
是一个封装了REST API接口的Flutter插件,旨在简化应用程序端的REST API集成。该插件基于 Dio
包,并参考了 restbase
包的设计。
入门指南
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 simple_rest_service
依赖:
dependencies:
simple_rest_service: ^0.1.0
2. 创建Rest API客户端类
你需要为每个API上下文创建一个类,并通过 baseUrl
进行区分。以下是一个示例,展示了如何创建一个名为 TaskRestApi
的类:
import 'package:simple_rest_service/simple_rest_service.dart';
class TaskRestApi extends RestService {
TaskRestApi() : super('https://your-task-api/api') {
// 添加拦截器以在调试控制台中查看事件
addInterceptor(PrintLogInterceptor());
// 可选:添加拦截器以在请求中添加访问令牌
addInterceptor(AuthInterceptor(
getToken: () async => (await FirebaseAuth.instance.currentUser?.getIdToken()) ?? '',
));
}
}
3. 使用Rest API客户端类
创建好 TaskRestApi
类后,你可以调用 getModel
, getList
, postModel
, postList
等方法来与API进行交互。以下是一个示例,展示了如何创建任务:
import 'package:simple_rest_service/simple_rest_service.dart';
class TaskItemModel {
final String id;
final String title;
final String description;
TaskItemModel({required this.id, required this.title, required this.description});
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'description': description,
};
}
factory TaskItemModel.fromMap(Map<String, dynamic> json) {
return TaskItemModel(
id: json['id'],
title: json['title'],
description: json['description'],
);
}
}
Future<TaskItemModel> createTask(TaskItemModel item) async {
final _taskRest = TaskRestApi();
final result = await _taskRest.postModel<TaskItemModel>(
'/task', // API的端点路径
item.toMap(), // 请求体
(json) => TaskItemModel.fromMap(json!), // 将返回的JSON转换为对象
);
if (result.success) {
return result.data; // 返回TaskItemModel对象
} else {
// 抛出自定义异常,这里假设 `GeneralAppFailure` 是你应用中的一个已知异常类
throw GeneralAppFailure()
..message = result.exception?.message
..statusCode = result.statusCode;
}
}
完整示例Demo
以下是一个完整的示例项目,展示了如何在Flutter应用中使用 simple_rest_service
插件:
import 'package:flutter/material.dart';
import 'package:simple_rest_service/simple_rest_service.dart';
// 定义任务模型
class TaskItemModel {
final String id;
final String title;
final String description;
TaskItemModel({required this.id, required this.title, required this.description});
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'description': description,
};
}
factory TaskItemModel.fromMap(Map<String, dynamic> json) {
return TaskItemModel(
id: json['id'],
title: json['title'],
description: json['description'],
);
}
}
// 定义任务API客户端
class TaskRestApi extends RestService {
TaskRestApi() : super('https://your-task-api/api') {
addInterceptor(PrintLogInterceptor());
addInterceptor(AuthInterceptor(
getToken: () async => (await FirebaseAuth.instance.currentUser?.getIdToken()) ?? '',
));
}
}
// 创建任务的方法
Future<TaskItemModel> createTask(TaskItemModel item) async {
final _taskRest = TaskRestApi();
final result = await _taskRest.postModel<TaskItemModel>(
'/task',
item.toMap(),
(json) => TaskItemModel.fromMap(json!),
);
if (result.success) {
return result.data!;
} else {
throw Exception('Failed to create task: ${result.exception?.message}');
}
}
// 主页面
class HomePage extends StatefulWidget {
const HomePage({super.key});
[@override](/user/override)
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final TextEditingController _titleController = TextEditingController();
final TextEditingController _descriptionController = TextEditingController();
String _statusMessage = '';
Future<void> _createTask() async {
try {
final task = TaskItemModel(
id: DateTime.now().millisecondsSinceEpoch.toString(),
title: _titleController.text,
description: _descriptionController.text,
);
await createTask(task);
setState(() {
_statusMessage = 'Task created successfully!';
});
} catch (e) {
setState(() {
_statusMessage = 'Failed to create task: $e';
});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Create Task'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _titleController,
decoration: const InputDecoration(labelText: 'Title'),
),
TextField(
controller: _descriptionController,
decoration: const InputDecoration(labelText: 'Description'),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _createTask,
child: const Text('Create Task'),
),
const SizedBox(height: 20),
Text(_statusMessage),
],
),
),
);
}
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Simple Rest Service Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
更多关于Flutter网络请求插件simple_rest_service的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求插件simple_rest_service的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,我可以为你提供一个关于如何使用Flutter网络请求插件simple_rest_service
的代码案例。simple_rest_service
是一个轻量级的Flutter插件,用于简化RESTful API的调用。以下是一个基本的示例,展示了如何配置和使用这个插件进行网络请求。
首先,你需要在你的pubspec.yaml
文件中添加simple_rest_service
依赖:
dependencies:
flutter:
sdk: flutter
simple_rest_service: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,我们将编写一个示例Flutter应用,展示如何使用simple_rest_service
进行GET和POST请求。
示例代码
- 创建服务类
首先,创建一个服务类来封装API调用。
import 'package:flutter/material.dart';
import 'package:simple_rest_service/simple_rest_service.dart';
class ApiService {
final SimpleRestClient client;
ApiService({required String baseUrl})
: client = SimpleRestClient(baseUrl: baseUrl);
Future<dynamic> getExampleData() async {
try {
final response = await client.get('/example-endpoint');
return response.data;
} catch (e) {
print(e);
return null;
}
}
Future<dynamic> postExampleData({required Map<String, dynamic> body}) async {
try {
final response = await client.post('/example-endpoint', body: body);
return response.data;
} catch (e) {
print(e);
return null;
}
}
}
- 使用服务类
在你的Flutter应用中使用这个服务类来获取和发送数据。
import 'package:flutter/material.dart';
import 'api_service.dart'; // 假设你的服务类文件名为api_service.dart
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final ApiService apiService = ApiService(baseUrl: 'https://api.example.com');
String? responseData;
@override
void initState() {
super.initState();
_fetchData();
}
Future<void> _fetchData() async {
final data = await apiService.getExampleData();
setState(() {
responseData = data?.toString();
});
}
Future<void> _postData() async {
final body = {'key': 'value'};
final data = await apiService.postExampleData(body: body);
setState(() {
responseData = data?.toString();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(responseData ?? 'Loading...'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _fetchData,
child: Text('GET Data'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: _postData,
child: Text('POST Data'),
),
],
),
),
);
}
}
解释
- ApiService 类:封装了GET和POST请求,通过
SimpleRestClient
实例进行API调用。 - MyApp 和 MyHomePage:Flutter应用的根组件和主页面,包含两个按钮,分别用于触发GET和POST请求,并显示响应数据。
注意事项
- 确保你的API端点是可访问的,并且你的Flutter应用有适当的网络权限(Android需要在
AndroidManifest.xml
中添加INTERNET权限)。 - 错误处理在实际应用中应更为细致,这里为了简洁起见只打印了错误。
希望这个示例能帮助你理解如何使用simple_rest_service
进行网络请求。如果有更多问题,欢迎继续提问!