在带有路径参数的路径上挂载一个 Vert.x 子路由器
Mounting a Vert.x sub-router on a path with path parameters
我想为我的 Vert.x 网络驱动 API 创建一个 URL 结构,以明确一些实体如何 "contained" 在其他实体中以及你如何 "traverse the entity path" 来查找子实体,所以我正在考虑使用类似这样的方法来解决 "grand child"(我不希望有比孙子更深的东西):
GET /entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id
所以通常我的 Router
配置看起来像这样:
router.get("/entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id")
.handler(r -> {
HttpServerRequest req = r.request();
Minipart p = Entities.get(req.getParameter("parent_id"))
.getPart(req.getParameter("child_id"))
.getMinipart(req.getParameter("grandchild_id"));
// do something with p
});
当我添加很多操作时(每个级别的每个实体class都有目录和创建操作,每个级别的实体实例都有获取、更新和删除操作,以及其他一些花絮) ,我的路由器 class 变得非常大。
我正在考虑使用子路由器来卸载子实体管理,所以 Entities
Router
配置可能会:
router.mountSubRouter("/entity/:parent_id/sub-entity", PartsRouter.init(vertx));
然后PartsRouter
可以做:
router.get("/:child_id").handler(r -> {
String parentEntityId = r.request().getParameter("parent_id");
Entity parent = Entities.get(parentEntityId);
String myid = r.request().getParameter("child_id");
Part myself = parent.getPart(myid);
// do something with myself
});
但是当我尝试访问子路由器操作时,我从 Vert.x...
收到 404 错误
更新:
显然 Vert.x 明确不支持这一点 - 它引发了一个异常,我的包装代码刚刚记录并忽略了,说:
java.lang.IllegalArgumentException: Can't use patterns in subrouter mounts
那么,是否有另一种方法可以实现我正在尝试做的事情(将大型路由器配置拆分为适当的 class 层次结构)?
我可以想出 2 种方法来解决您的问题:
第一个是有一个初始处理程序来处理请求的公共部分并调用下一个,以便下一个将在第一个停止的地方继续,例如:
router.route("/entity/:parent_id/sub-entity", ctx -> {
// common part here...
ctx.next();
});
然后:
router.route("/entity/:parent_id/sub-entity/:child_id", ctx -> {
String parentEntityId = r.request().getParameter("parent_id");
Entity parent = Entities.get(parentEntityId);
String myid = r.request().getParameter("child_id");
Part myself = parent.getPart(myid);
// do something with myself
});
或者,您可以使用内部重定向,这样您就可以像以前一样处理初始代码,而不是调用 next()
,而是重定向到另一个 URL。在这种情况下,您应该在上下文中存储要重用的内容,因为请求将在新位置重新启动。
我想为我的 Vert.x 网络驱动 API 创建一个 URL 结构,以明确一些实体如何 "contained" 在其他实体中以及你如何 "traverse the entity path" 来查找子实体,所以我正在考虑使用类似这样的方法来解决 "grand child"(我不希望有比孙子更深的东西):
GET /entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id
所以通常我的 Router
配置看起来像这样:
router.get("/entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id")
.handler(r -> {
HttpServerRequest req = r.request();
Minipart p = Entities.get(req.getParameter("parent_id"))
.getPart(req.getParameter("child_id"))
.getMinipart(req.getParameter("grandchild_id"));
// do something with p
});
当我添加很多操作时(每个级别的每个实体class都有目录和创建操作,每个级别的实体实例都有获取、更新和删除操作,以及其他一些花絮) ,我的路由器 class 变得非常大。
我正在考虑使用子路由器来卸载子实体管理,所以 Entities
Router
配置可能会:
router.mountSubRouter("/entity/:parent_id/sub-entity", PartsRouter.init(vertx));
然后PartsRouter
可以做:
router.get("/:child_id").handler(r -> {
String parentEntityId = r.request().getParameter("parent_id");
Entity parent = Entities.get(parentEntityId);
String myid = r.request().getParameter("child_id");
Part myself = parent.getPart(myid);
// do something with myself
});
但是当我尝试访问子路由器操作时,我从 Vert.x...
收到 404 错误更新:
显然 Vert.x 明确不支持这一点 - 它引发了一个异常,我的包装代码刚刚记录并忽略了,说:
java.lang.IllegalArgumentException: Can't use patterns in subrouter mounts
那么,是否有另一种方法可以实现我正在尝试做的事情(将大型路由器配置拆分为适当的 class 层次结构)?
我可以想出 2 种方法来解决您的问题:
第一个是有一个初始处理程序来处理请求的公共部分并调用下一个,以便下一个将在第一个停止的地方继续,例如:
router.route("/entity/:parent_id/sub-entity", ctx -> {
// common part here...
ctx.next();
});
然后:
router.route("/entity/:parent_id/sub-entity/:child_id", ctx -> {
String parentEntityId = r.request().getParameter("parent_id");
Entity parent = Entities.get(parentEntityId);
String myid = r.request().getParameter("child_id");
Part myself = parent.getPart(myid);
// do something with myself
});
或者,您可以使用内部重定向,这样您就可以像以前一样处理初始代码,而不是调用 next()
,而是重定向到另一个 URL。在这种情况下,您应该在上下文中存储要重用的内容,因为请求将在新位置重新启动。