vertx如何使用查询参数重新路由

时间:2019-06-07 15:04:37

标签: vert.x

由于某些url版本控制,我们尝试将多个路径映射到同一处理程序。

我试图通过重新路由来实现这一点,但是查询参数在此过程中丢失了。

// reroute if the path contains apiv3 / api v3
        router.route("/apiv3/*").handler( context -> {
            String path = context.request().path();
            path = path.replace("apiv3/", "");
            LOG.info("Path changed to {}", path);
            context.reroute(path);
        });

解决此问题的最优雅方法是什么?

在Google网上论坛上有一些讨论,但令人惊讶的是,实现起来并不简单快捷。

1 个答案:

答案 0 :(得分:1)

reroute文档说:

  

很明显,重新路由适用于路径,因此如果您需要   在重新路由中保留和/或添加状态,应使用   RoutingContext对象。

因此,您可以创建一条全局捕获的路由,将所有查询参数存储在RoutingContext中:

router.route().handler(ctx -> {
        ctx.put("queryParams", ctx.queryParams());
        ctx.next();
    });

然后使用您的apiv3全部路线:

router.route("/apiv3/*").handler( context -> {
  String path = context.request().path();
  path = path.replace("apiv3/", "");
  LOG.info("Path changed to {}", path);
  context.reroute(path);
});

最后是一个实际的路由处理程序:

router.get("/products").handler(rc -> {
  MultiMap queryParams = rc.get("queryParams");
  // handle request
});