undertow 的路由模板格式
Routing template format for undertow
是否有任何关于undertow 的路由模板格式的文档。我想像这样设置处理程序:
/ or /index.html -> Use handler 1
Anything else -> Use handler 2
这个我试过了,没用:
Handlers.routing()
.add("GET", "/", handler1)
.add("GET", "/index.html", handler1)
.add("GET", "/*", handler2)
有什么想法吗?
有几种方法可以实现这一点:
1)基本方法:PathHandler
Handlers.path()
.addExactPath("/path1", handler1)
.addPrefixPath("/path2", handler2);
handler1
将仅匹配 /path1(或 /path1/)。
handler2
将匹配 /path2、/path2/ 以及以 [=61= 开头的所有其他内容]/路径2/.
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"); // or exchange.getQueryParameters().get("test")
String itemId2 = pathMatch.getParameters().get("*"); // or exchange.getQueryParameters().get("*")
}))
*
参数可以匹配任何东西(例如 a/b/c
的路径)。
为了使用 *
参数,您需要一个之前在路由模板中定义的实际命名参数(在我的示例中为 test
)。
请注意,您的路线模板中定义的参数将与查询参数一起使用 (exchange.getQueryParameters()
)。这是默认行为。如果你不想要它,你可以像这样创建你的路由处理程序:Handlers.routing(false).get(...)
然后从交换的附件中检索参数。
对于任何与您的路由处理程序不匹配的路由,您可以使用 RoutingHandler
中可用的 fallbackHandler
。
Handlers.routing()
.get("/", handler1)
.get("/index.html", handler1)
.setFallbackHandler(handler2);
默认情况下 fallbackHandler
只是 returns 带有 404 状态代码的空响应主体。 handler2
将匹配任何其他请求,而不仅仅是 GET 请求。
综合示例
您当然可以组合 PathHandler
和 RoutingHandler
以满足您的需要。
这是一个更真实的设置的小例子:
Undertow.builder().addHttpListener(8080, "0.0.0.0")
.setHandler(Handlers.path()
// REST API path
.addPrefixPath("/api", Handlers.routing()
.get("/customers", exchange -> {...})
.delete("/customers/{customerId}", exchange -> {...})
.setFallbackHandler(exchange -> {...}))
// Redirect root path to /static to serve the index.html by default
.addExactPath("/", Handlers.redirect("/static"))
// Serve all static files from a folder
.addPrefixPath("/static", new ResourceHandler(
new PathResourceManager(Paths.get("/path/to/www/"), 100))
.setWelcomeFiles("index.html"))
).build().start();
此应用程序还提供文件系统中的静态文件。例如,这对于 javascript 应用程序或静态 html 文件很方便。
是否有任何关于undertow 的路由模板格式的文档。我想像这样设置处理程序:
/ or /index.html -> Use handler 1
Anything else -> Use handler 2
这个我试过了,没用:
Handlers.routing()
.add("GET", "/", handler1)
.add("GET", "/index.html", handler1)
.add("GET", "/*", handler2)
有什么想法吗?
有几种方法可以实现这一点:
1)基本方法:PathHandler
Handlers.path()
.addExactPath("/path1", handler1)
.addPrefixPath("/path2", handler2);
handler1
将仅匹配 /path1(或 /path1/)。
handler2
将匹配 /path2、/path2/ 以及以 [=61= 开头的所有其他内容]/路径2/.
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"); // or exchange.getQueryParameters().get("test")
String itemId2 = pathMatch.getParameters().get("*"); // or exchange.getQueryParameters().get("*")
}))
*
参数可以匹配任何东西(例如 a/b/c
的路径)。
为了使用 *
参数,您需要一个之前在路由模板中定义的实际命名参数(在我的示例中为 test
)。
请注意,您的路线模板中定义的参数将与查询参数一起使用 (exchange.getQueryParameters()
)。这是默认行为。如果你不想要它,你可以像这样创建你的路由处理程序:Handlers.routing(false).get(...)
然后从交换的附件中检索参数。
对于任何与您的路由处理程序不匹配的路由,您可以使用 RoutingHandler
中可用的 fallbackHandler
。
Handlers.routing()
.get("/", handler1)
.get("/index.html", handler1)
.setFallbackHandler(handler2);
默认情况下 fallbackHandler
只是 returns 带有 404 状态代码的空响应主体。 handler2
将匹配任何其他请求,而不仅仅是 GET 请求。
综合示例
您当然可以组合 PathHandler
和 RoutingHandler
以满足您的需要。
这是一个更真实的设置的小例子:
Undertow.builder().addHttpListener(8080, "0.0.0.0")
.setHandler(Handlers.path()
// REST API path
.addPrefixPath("/api", Handlers.routing()
.get("/customers", exchange -> {...})
.delete("/customers/{customerId}", exchange -> {...})
.setFallbackHandler(exchange -> {...}))
// Redirect root path to /static to serve the index.html by default
.addExactPath("/", Handlers.redirect("/static"))
// Serve all static files from a folder
.addPrefixPath("/static", new ResourceHandler(
new PathResourceManager(Paths.get("/path/to/www/"), 100))
.setWelcomeFiles("index.html"))
).build().start();
此应用程序还提供文件系统中的静态文件。例如,这对于 javascript 应用程序或静态 html 文件很方便。