Flutter网络请求插件simple_rest_service的使用

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

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

1 回复

更多关于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请求。

示例代码

  1. 创建服务类

首先,创建一个服务类来封装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;
    }
  }
}
  1. 使用服务类

在你的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进行网络请求。如果有更多问题,欢迎继续提问!

回到顶部