5

我想为我的 Vert.x Web 驱动的 API 创建一个 URL 结构,以清楚地说明某些实体是如何“包含”在其他实体中的,以及您如何“遍历实体路径”来查找子实体,所以我正在考虑使用像这样解决“孙子”的问题(我不希望有比孙子更深的东西):

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
    });

当我添加很多操作时(每个级别的每个实体类都有目录和创建操作,每个级别实体实例都有获取、更新和删除操作,以及其他一些花絮),我的路由器类变得非常大。

我正在考虑使用子路由器来卸载子实体管理,因此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

那么,是否有另一种方法来实现我想要做的事情(将大型路由器配置拆分为适当的类层次结构)?

4

1 回答 1

1

我可以想象两种解决问题的方法:

第一个是有一个初始处理程序来处理请求的公共部分并调用下一个,因此以下一个将在第一个停止的地方继续,例如:

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

于 2016-09-22T10:58:16.477 回答