有几种方法可以实现这一点:
1) 基本方法: PathHandler
Handlers.path()
.addExactPath("/path1", handler1)
.addPrefixPath("/path2", handler2);
handler1
只匹配 /path1 (或 /path1/)。
handler2
匹配 /path2,/path2/ 以及所有以 /path2/ 开头的路径。
2) 路由方式: RoutingHandler
如果您使用 RoutingHandler
,则可以轻松地从路径中提取变量。这对于构建 REST API 非常方便(请注意在 RoutingHandler
上使用方便的 get
方法)。
Handlers.routing().get("/{test}/*", exchange -> {
PathTemplateMatch pathMatch = exchange.getAttachment(PathTemplateMatch.ATTACHMENT_KEY);
String itemId1 = pathMatch.getParameters().get("test");
String itemId2 = pathMatch.getParameters().get("*");
}))
*
参数可以匹配任何内容(比如路径a/b/c
)。
使用*
参数需要在路由模板中先定义一个实际的命名参数(例如我的例子中的test
)。
请注意,你在路由模板中定义的参数将与查询参数一起可用(exchange.getQueryParameters()
)。这是默认行为。如果不想这样做,可以这样创建路由处理器:Handlers.routing(false).get(...)
,然后从交换机的附件中检索参数。
对于任何未被路由处理器匹配的路由,你可以使用RoutingHandler
中提供的fallbackHandler
。
Handlers.routing()
.get("/", handler1)
.get("/index.html", handler1)
.setFallbackHandler(handler2);
默认情况下,fallbackHandler
只会返回一个空的响应体和404状态码。 handler2
将匹配除GET请求之外的任何其他请求。
综合示例
当然,您可以组合PathHandler
和RoutingHandler
以适应您的需求。
以下是更实际设置的简单示例:
Undertow.builder().addHttpListener(8080, "0.0.0.0")
.setHandler(Handlers.path()
.addPrefixPath("/api", Handlers.routing()
.get("/customers", exchange -> {...})
.delete("/customers/{customerId}", exchange -> {...})
.setFallbackHandler(exchange -> {...}))
.addExactPath("/", Handlers.redirect("/static"))
.addPrefixPath("/static", new ResourceHandler(
new PathResourceManager(Paths.get("/path/to/www/"), 100))
.setWelcomeFiles("index.html"))
).build().start();
此应用程序还可以从您的文件系统中提供静态文件。这对于服务JavaScript应用程序或静态HTML文件非常方便。
/sample1/*
和/sample2/*
,那么单个回退处理程序将无法工作。 - user1079877