由于某些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网上论坛上有一些讨论,但令人惊讶的是,实现起来并不简单快捷。
答案 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
});