路径的路由模板格式

use*_*877 8 java undertow

是否有关于路径的路由模板格式的文档.我想设置这样的处理程序:

/ or /index.html -> Use handler 1
Anything else -> Use handler 2
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但是没有用:

Handlers.routing()
        .add("GET", "/", handler1)
        .add("GET", "/index.html", handler1)
        .add("GET", "/*", handler2)
Run Code Online (Sandbox Code Playgroud)

任何的想法?

ara*_*aki 28

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

1)基本方法: PathHandler

Handlers.path()
    .addExactPath("/path1", handler1)
    .addPrefixPath("/path2", handler2);
Run Code Online (Sandbox Code Playgroud)

该handler1会只在符合/路径1(或/路径1 /).

该handler2对将匹配/路径,/路径/与开始,一切/路径/.

2)路线方法: RoutingHandler

如果使用a RoutingHandler,则可以选择从路径中轻松提取变量.例如,这对于构建REST API很方便(请注意使用方便get方法RoutingHandler).

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("*")
}))
Run Code Online (Sandbox Code Playgroud)

该*参数可以匹配任何内容(例如路径a/b/c).要使用该*参数,您需要在路径模板中定义之前定义的实际命名参数(test在我的示例中).

请注意,路径模板中定义的参数将与查询参数(exchange.getQueryParameters())一起使用.这是默认行为.如果您不想要它,可以像这样创建路由处理程序:Handlers.routing(false).get(...)然后从交换机的附件中检索参数.

对于路由处理程序不匹配的任何路由,您可以使用中的fallbackHandler可用路由RoutingHandler.

Handlers.routing()
      .get("/", handler1)
      .get("/index.html", handler1)
      .setFallbackHandler(handler2);
Run Code Online (Sandbox Code Playgroud)

默认情况下,fallbackHandler只返回一个带有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();
Run Code Online (Sandbox Code Playgroud)

此应用程序还提供文件系统中的静态文件.例如,这对于提供javascript应用程序或静态html文件很方便.