【问题标题】:Routing template format for undertowundertow 的路由模板格式
【发布时间】:2017-02-06 02:37:59
【问题描述】:

是否有任何关于 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)

有什么想法吗?

【问题讨论】:

    标签: java undertow


    【解决方案1】:

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

    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/* 则单个后备处理程序不起作用。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2018-03-30
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多