在带有路径参数的路径上挂载一个 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。在这种情况下,您应该在上下文中存储要重用的内容,因为请求将在新位置重新启动。