Undertow的路由模板格式

11

有没有有关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个回答

33

有几种方法可以实现这一点:

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文件非常方便。


谢谢您的回答。您的回答对我的示例是正确的,但我指的是处理通配符的一般方法。如果我们有两个/sample1/*/sample2/*,那么单个回退处理程序将无法工作。 - user1079877

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接