java - undertow 的路由模板格式

标签 java undertow

有没有关于undertow.routing模板格式的文档?我想像这样设置处理程序:

/ 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/ 以及以 /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"); // 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 仅返回带有 404 状态代码的空响应主体。 handler2 将匹配任何其他请求,而不仅仅是 GET 请求。

综合示例

您当然可以结合使用 PathHandlerRoutingHandler 来满足您的需要。

这是一个更现实的设置的小例子:

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 文件提供服务很方便。

关于java - undertow 的路由模板格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39742014/

相关文章:

java - Java:HashMap.getOrDefault返回空值

java - 后缀评估器

java - 如何在没有JNI的情况下在spring mvc中调用dll共享库

java - org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure : Could not find MessageBodyWriter for response object of type

java - WIldfly/Undertow UT010029 流已关闭

Java Jar 和 Classpath 问题

java - 如何处理静态方法覆盖?

java - 如何在WildFly(耳朵中)中配置EJB WebServices

java - 运行 "empty"Undertow 时每秒 HTTP 请求数的限制因素是什么?

spring - 如何为 Spring Boot/MVC 资源设置可识别的内容/MIME 类型?