# 如何使用路由

路由的作用是解析请求路径,并且转发到相应的控制器方法进行处理。

lib/config/route.dart 文件中,我们可以定义路由信息。

当你创建完项目后,打开该文件,我们可以看到相关的示例。

import '../bootstrap/helper/RouteHelper.dart';
import '../app/controller/HomeController.dart' as app_controller_HomeController;

///
/// don't modify this file yourself, this file content will be replace by DartMars
///
/// for more infomation, see doc about Route
///
/// last replace time 2021-06-19 10:20:26.386828
///
void configRoute() {
  RouteHelper.add('GET', '/', app_controller_HomeController.HomeController.index);
  RouteHelper.add('GET', '/user', app_controller_HomeController.HomeController.user);
  RouteHelper.add('GET', '/city/:cityName', app_controller_HomeController.HomeController.city);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

请注意该文件内的提示:你自己不要修改该文件,该文件的内容会被 DartMars 自动替换掉

don't modify this file yourself, this file content will be replace by DartMars
1

# 如何添加路由规则

如示例内容所看到的,当引入路由帮助类 RouteHelper 后,你可以通过以下代码,添加路由规则

RouteHelper.add('GET', '/user', app_controller_HomeController.HomeController.user);
1

这里意思是: 当请求方式是 GET 请求,并且请求路径是 /user 时, 将该请求交给 app_controller_HomeController.HomeController.user 这个控制器方法去处理。

import '../app/controller/HomeController.dart' as app_controller_HomeController;
1

结合以上导入信息,我们可知 app_controller_HomeControllerHomeController 类的别名。

HomeController 类的相对路径为 ../app/controller/HomeController.dart

# 如何更改路由请求方式

上述的例子中,添加路由规则时,所允许的请求方式为 GET ,当然可以改成其他的,比如:

RouteHelper.add('POST', '/user', app_controller_HomeController.HomeController.user);
1

改成 POST,即表示仅接受 POST 请求

RouteHelper.add('POST|GET', '/user', app_controller_HomeController.HomeController.user);
1

改成 POST|GET,即表示同时接受 POST 或者 GET 请求

RouteHelper.add('*', '/user', app_controller_HomeController.HomeController.user);
1

改成 *,即表示接受所有请求方式, 即 POST , GET , HEAD , PUT , DELETE , CONNECT , OPTIONS , TRACE

# 如何匹配请求路径

如你所见,在下面的代码中

RouteHelper.add('GET', '/', app_controller_HomeController.HomeController.index);
RouteHelper.add('GET', '/user', app_controller_HomeController.HomeController.user);
RouteHelper.add('GET', '/city/:cityName', app_controller_HomeController.HomeController.city);
1
2
3

第一行, 路由路径为 / ,表示当请求路径为 / 时, 执行该路由定义的操作。

第二行, 路由路径为 /user ,表示当请求路径为 /user 时, 执行该路由定义的操作。

第三行, 路由路径为 /city/:cityName ,表示当请求路径类似于以下时, 均可执行该路由定义的操作。

/city/beijing   
/city/shanghai    
/city/newyork   
1
2
3

# 如何接收路由匹配参数

如上述,当路由路径为 /city/:cityName 时,可匹配类似于以下的请求路径

/city/beijing   
/city/shanghai    
/city/newyork   
1
2
3

DartMars 的内部处理逻辑,会将 :city 所对应的信息作为参数,传送给该路由所定义的控制器方法。

打开文件 HomeController.dart 文件,你可以看到相关内容

('/city/:cityName', 'GET')
static void city(Context ctx, String cityName) async {
    ctx.html("hello " + cityName);
}
1
2
3
4

其中第二行中的 cityName 即是从请求路径中得到的参数

# 如何自动生成路由配置文件

路由配置文件的规则,可以人工添加,但是我们强烈建议不要这样做。因为项目会越来越大,路由规则会有很多,人工添加容易出错。

DartMars 提供了自动生成路由配置文件的功能,可以很方便的完成该工作。

你需要做的事情是,在写控制器方式时,在前面加上 @RouteMeta, 像这样

('/city/:cityName', 'GET')
1

@RouteMeta 接收两个参数,第一个是路由路径,第二个是请求方式

然后,当你使用下述命令启动项目时,

dart pub global run dart_mars --serve dev
1

DartMars 会遍历所有 lib/app 文件夹下,标记有 @RouteMeta 的方法,将全部被写入路由配置文件。

然后命令行提示:路由配置文件已经更新。

route config file has been updated, see ./lib/config/route.dart 
1

请注意,为了使用 @RouteMeta, 你需要提前导入 RouteMeta.dart

import 'package:{package}/bootstrap/meta/RouteMeta.dart';
1

扩展阅读 在文档中, {package} 是什么意思 (opens new window)