Flutter微服务集成插件micro_serve的使用

Flutter微服务集成插件micro_serve的使用

Micro Serve

Micro Serve

micro_serve 包为 Flutter 设计,用于初始化一个高效管理请求和服务器端操作的 HTTP 服务器,使用的是原始 Dart 代码。

示例

特性

  • HTTP处理

    • 管理传入的 HTTP 请求并发送响应。
  • 路由

    • 定义路由(GET、POST、PUT、DELETE、PATCH)并将其链接到请求处理器。
  • 请求解析

    • 读取和解析来自请求的查询参数、头部和正文。
  • 响应处理

    • 创建并发送带有状态码和内容的响应。
  • 错误处理

    • 优雅地管理错误并发送适当的错误响应。

开始使用

添加包到 pubspec.yaml 文件:

dependencies:
  micro_serve: <最新版本>

Android 配置

AndroidManifest.xml 中添加权限:

<manifest xmlns:android="..." >
  <uses-permission android:name="android.permission.INTERNET"/> <!-- 添加此行 -->
  <application....>
</manifest>

macOS 配置

允许网络访问在相关的 *.entitlements 文件中:

<key>com.apple.security.network.client</key>
<true/>

导入包

import 'package:micro_serve/micro_serve.dart';

初始化服务器

void main() {
  final MicroServe server = MicroServe();

  server.get("/test", (ServerContext serverContext) async {
    final Response response = Response(
      statusCode: 200,
      data: "Welcome Micro-Serve",
    );
    serverContext.send(response);
  });

  server.listen(ipAddress: "127.0.0.1", port: 3000);
}

使用示例

创建 MicroServe 对象

final MicroServe _server = MicroServe();

启动服务器函数

void _serverOn() async {
  // 定义路由
  _server.get("/", _welcome);
  _server.post("/create", _createTask);
  _server.get("/read", _readTasks);
  _server.put("/update", _updateTask);
  _server.delete("/delete", _deleteTask);

  // 获取 WiFi IP 地址
  final String? lanWifiIp = await Network.getIp(NetworkType.wlan);
  const int port = 3000;

  // 服务器启动
  _server.listen(
    ipAddress: lanWifiIp,
    port: port,
    callBack: (isServerInitiated) {
      if (isServerInitiated) {
        setState(() {});
      } else {
        // print("Something went wrong");
      }
    },
  );
}

关闭服务器函数

void _serverOff() async {
  await _server.close();
  setState(() {});
}

处理器函数

void _welcome(ServerContext serverContext) async {
  Response response = Response(
    statusCode: 200,
    data: {
      "message": "Server is Running...",
      "clientIp": serverContext.connectionInfo.address,
    },
  );
  serverContext.send(response);
}

void _createTask(ServerContext serverContext) async {
  final Request request = serverContext.request;
  final Task newTask = Task.fromJson(jsonDecode(request.body));

  Response response = Response();
  if (_taskStore.containsKey(newTask.id)) {
    response.statusCode = HttpStatus.conflict_409.code;
    response.data = {"message": "already exist"};
  } else {
    _taskStore[newTask.id] = newTask;
    final Map responseBody = {
      "message": "created successfully",
      "total": _taskStore.length,
    };
    response.statusCode = HttpStatus.created_201.code;
    response.data = responseBody;
  }

  serverContext.send(response);
}

void _readTasks(ServerContext serverContext) async {
  final List<Map> taskList = [];

  for (Task task in _taskStore.values) {
    taskList.add(task.toJson());
  }

  final Map data = {
    "message": "fetched successfully",
    "data": taskList,
  };
  Response response = Response(
    statusCode: HttpStatus.ok_200.code,
    data: data,
  );

  serverContext.send(response);
}

void _updateTask(ServerContext serverContext) async {
  final Request request = serverContext.request;

  final int id = int.parse(request.queryParams["id"]!);
  final String name = jsonDecode(request.body)["name"];
  final bool isDone = jsonDecode(request.body)["isDone"];
  final String? apiKey = request.headers["api-key"];

  final Response response = Response();

  if (apiKey != "abcd1234") {
    response.statusCode = HttpStatus.unauthorized_401.code;
    response.data = {"message": "invalid api key"};
  } else if (!_taskStore.containsKey(id)) {
    response.statusCode = HttpStatus.notFound_404.code;
    response.data = {"message": "not found"};
  } else {
    _taskStore[id]!.name = name;
    _taskStore[id]!.isDone = isDone;

    response.statusCode = HttpStatus.accepted_202.code;
    response.data = {"message": "updated successfully"};
  }

  serverContext.send(response);
}

void _deleteTask(ServerContext serverContext) async {
  final Request request = serverContext.request;
  final int taskId = int.parse(request.queryParams["id"]!);

  final Response response = Response();
  if (!_taskStore.containsKey(taskId)) {
    response.statusCode = HttpStatus.notFound_404.code;
    response.data = {"message": "not found"};
  } else {
    _taskStore.remove(taskId);

    final Map responseBody = {
      "message": "deleted successfully",
      "total": _taskStore.length,
    };
    response.statusCode = HttpStatus.accepted_202.code;
    response.data = responseBody;
  }

  serverContext.send(response);
}

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

1 回复

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


在Flutter项目中集成微服务通常涉及到与后端服务的通信。虽然Flutter本身不直接提供微服务的集成功能,但你可以使用第三方插件和库来实现这一目的。micro_serve 插件(假设这是一个假想的或特定环境下的插件名称,因为在实际Flutter生态系统中,没有广泛认知的名为 micro_serve 的官方插件)可能会提供一个简化与微服务通信的接口。

不过,为了说明如何在Flutter中集成微服务,我们可以使用 dio 库,这是一个流行的HTTP客户端,用于在Flutter应用中发送网络请求。我们将展示如何配置 dio 来与微服务进行通信。

步骤 1: 添加依赖

首先,在你的 pubspec.yaml 文件中添加 dio 依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.4  # 确保使用最新版本

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

步骤 2: 配置Dio实例

创建一个 dio 实例,并配置基础URL、超时等设置。你可以创建一个单独的文件来管理HTTP客户端的配置,例如 http_service.dart

import 'package:dio/dio.dart';

class HttpService {
  static final Dio _dio = Dio(
    BaseOptions(
      baseUrl: 'https://your-microservice-api-base-url.com/api/', // 微服务的基地址
      connectTimeout: 5000,
      receiveTimeout: 3000,
    ),
  );

  static Future<dynamic> get(String endpoint, {Map<String, dynamic>? params}) async {
    try {
      Response response = await _dio.get(endpoint, queryParameters: params);
      return response.data;
    } catch (e) {
      print("GET request failed: ${e.message}");
      throw e;
    }
  }

  static Future<dynamic> post(String endpoint, {Map<String, dynamic>? data}) async {
    try {
      Response response = await _dio.post(endpoint, data: data);
      return response.data;
    } catch (e) {
      print("POST request failed: ${e.message}");
      throw e;
    }
  }

  // 可以根据需要添加PUT, DELETE等方法
}

步骤 3: 使用HttpService进行API调用

在你的业务逻辑中使用 HttpService 类来调用微服务API。例如,在一个Flutter页面中获取用户数据:

import 'package:flutter/material.dart';
import 'http_service.dart';

class UserDataPage extends StatefulWidget {
  @override
  _UserDataPageState createState() => _UserDataPageState();
}

class _UserDataPageState extends State<UserDataPage> {
  late Future<dynamic> _userDataFuture;

  @override
  void initState() {
    super.initState();
    _userDataFuture = _fetchUserData();
  }

  Future<dynamic> _fetchUserData() async {
    return await HttpService.get('users/1'); // 假设获取ID为1的用户数据
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('User Data'),
      ),
      body: Center(
        child: FutureBuilder<dynamic>(
          future: _userDataFuture,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                // 假设返回的数据结构为 {name: String, email: String}
                Map<String, dynamic> userData = snapshot.data as Map<String, dynamic>;
                return Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('Name: ${userData['name']}'),
                    Text('Email: ${userData['email']}'),
                  ],
                );
              }
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

总结

虽然 micro_serve 插件在Flutter社区中可能不存在,但你可以使用 dio 这样的HTTP客户端库来与微服务进行通信。上面的代码示例展示了如何配置 dio 实例,并使用它来发送GET请求以获取用户数据。你可以根据需要扩展这个示例,包括添加错误处理、重试逻辑、身份验证等功能。

回到顶部