Flutter路由管理类插件shelf_router_classes的使用

Flutter路由管理类插件shelf_router_classes的使用

shelf_router_classes 是一个用于简化 shelfshelf_router 包中路由声明和使用的插件。通过使用类和 @Route 注解,它可以自动处理所有声明,无需代码生成。

安装

在你的 pubspec.yaml 文件中添加 shelf_router_classes 作为依赖:

dependencies:
  shelf_router_classes: ^x.x.x

然后运行 flutter pub get 来安装它。

使用

使用方式非常简单。首先,你需要使用类和 @Route 注解来声明你的路由。以下是一个示例:

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_router_classes/shelf_router_classes.dart';

@RoutePrefix('/prefix')
class ExampleService {
  // GET 请求 /prefix/example
  @Route('GET', '/example')
  Response getAllExamples(Request request) {
    return Response.ok('["1", "2", "3", "4"]');
  }

  // GET 请求 /prefix/example/number
  @Route('GET', '/example/<number>')
  Response getSpecificExample(Request request, int number) {
    return Response.ok(number);
  }

  // POST 请求 /prefix/example
  @Route('POST', '/example')
  Future<Response> postExampe(Request request) async {
    return Response.ok(await request.readAsString());
  }
}

在上面的代码中,我们定义了三个方法来处理不同类型的 HTTP 请求。每个方法都有一个 @Route 注解来指定请求类型和路径。

接下来,你可以将这些类传递给 getRoutersByClass 方法来创建路由器,并将其服务化:

void main(List<String> arguments) async {
  // 创建路由器并传入包含路由的类
  Router router = getRoutersByClass([ExampleService]);

  // 启动服务器
  await serve(logRequests().addHandler(router), 'localhost', 8080);
}

现在,所有你声明的 @Route 注解都会自动被注册到路由器中,并且可以通过浏览器访问它们。例如,你可以通过访问 http://localhost:8080/prefix/example 来测试 getAllExamples 方法。

更多示例

以下是一个更复杂的示例,展示了如何同时使用多个服务类:

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_router_classes/shelf_router_classes.dart';

import 'example_second_service.dart'; // 引入第二个服务类
import 'example_service.dart'; // 引入第一个服务类

void main(List<String> arguments) async {
  // 创建路由器并传入多个服务类
  Router router = getRoutersByClass([ExampleService, ExampleSecondService]);

  // 启动服务器
  await serve(logRequests().addHandler(router), 'localhost', 8080);
}

更多关于Flutter路由管理类插件shelf_router_classes的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter路由管理类插件shelf_router_classes的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Shelf 是一个用于构建 HTTP 服务器的 Dart 包,而 shelf_routerShelf 的一个扩展,用于更方便地管理路由。shelf_router_classes 是一个基于 shelf_router 的插件,它允许你使用类和方法来定义路由,从而使得代码更加模块化和易于维护。

安装

首先,你需要在 pubspec.yaml 文件中添加 shelfshelf_routershelf_router_classes 依赖:

dependencies:
  shelf: ^1.1.0
  shelf_router: ^1.1.0
  shelf_router_classes: ^1.0.0

然后运行 flutter pub get 来安装这些依赖。

基本用法

ShelfRouterClasses 允许你通过类和方法来定义路由。以下是一个简单的例子:

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_router_classes/shelf_router_classes.dart';

class Api {
  // 使用 `@route` 注解标记路由方法
  [@Route](/user/Route).get('/hello')
  Response hello(Request request) {
    return Response.ok('Hello, world!');
  }

  [@Route](/user/Route).post('/greet')
  Response greet(Request request) async {
    final name = await request.readAsString();
    return Response.ok('Hello, $name!');
  }
}

void main() async {
  // 创建路由实例
  final app = Router();

  // 使用 `ShelfRouterClasses` 将类中的路由方法添加到路由器
  final api = Api();
  ShelfRouterClasses(app).add(api);

  // 启动服务器
  var server = await serve(app, 'localhost', 8080);
  print('Server running on localhost:${server.port}');
}

路由注解

ShelfRouterClasses 提供了多种注解来定义不同类型的路由:

  • [@Route](/user/Route).get(path): 定义一个 GET 请求的路由。
  • [@Route](/user/Route).post(path): 定义一个 POST 请求的路由。
  • [@Route](/user/Route).put(path): 定义一个 PUT 请求的路由。
  • [@Route](/user/Route).delete(path): 定义一个 DELETE 请求的路由。
  • [@Route](/user/Route).all(path): 定义一个处理所有 HTTP 方法的路由。

路由参数

你还可以在路由路径中使用参数。例如:

[@Route](/user/Route).get('/user/<id>')
Response getUser(Request request, String id) {
  return Response.ok('User ID: $id');
}

中间件

ShelfRouterClasses 也支持中间件。你可以通过在方法上添加 @Middleware 注解来应用中间件:

[@Route](/user/Route).get('/secure')
@Middleware(validateToken)
Response secure(Request request) {
  return Response.ok('Secure content');
}

Handler validateToken(Handler handler) {
  return (Request request) async {
    // 验证逻辑
    if (request.headers['token'] != 'valid-token') {
      return Response.forbidden('Invalid token');
    }
    return handler(request);
  };
}

完整的例子

以下是一个更完整的例子,展示了如何使用 ShelfRouterClasses 来构建一个简单的 API:

import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_router_classes/shelf_router_classes.dart';

class UserApi {
  [@Route](/user/Route).get('/user/<id>')
  Response getUser(Request request, String id) {
    return Response.ok('User ID: $id');
  }

  [@Route](/user/Route).post('/user')
  Response createUser(Request request) async {
    final body = await request.readAsString();
    return Response.ok('User created with data: $body');
  }
}

class ProductApi {
  [@Route](/user/Route).get('/product/<id>')
  Response getProduct(Request request, String id) {
    return Response.ok('Product ID: $id');
  }
}

void main() async {
  final app = Router();

  ShelfRouterClasses(app)
    ..add(UserApi())
    ..add(ProductApi());

  var server = await serve(app, 'localhost', 8080);
  print('Server running on localhost:${server.port}');
}
回到顶部