2016-09-28 5 views
3

Есть ли какая-либо документация о формате шаблона маршрутизации для подбора. Я хочу, чтобы обработчики установки, как это:Формат шаблона маршрутизации для подхвата

/ or /index.html -> Use handler 1 
Anything else -> Use handler 2 

Я попробовал этот, бушель не получилось:

Handlers.routing() 
     .add("GET", "/", handler1) 
     .add("GET", "/index.html", handler1) 
     .add("GET", "/*", handler2) 

Любая идея?

ответ

11

Существует несколько способов для достижения этой цели:

1) Основной подход: PathHandler

Handlers.path() 
    .addExactPath("/path1", handler1) 
    .addPrefixPath("/path2", handler2); 

handler1 будет соответствовать только /path1 (или /path1/).

handler2 будет соответствовать на /путь2, /path2/ и все остальное, что начинается с /путь2/.

2) Маршрут подход: RoutingHandler

Если вы используете RoutingHandler, у вас есть возможность легко извлечь переменные из путей. Это удобно для создания API REST, например (обратите внимание на использование метода 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("*") 
})) 

Параметр * может соответствовать что-нибудь (например, путь, например a/b/c). Для использования параметра * вам нужен фактический именованный параметр, определенный ранее в шаблоне маршрута (test в моем примере).

Обратите внимание, что параметры, определенные в шаблоне маршрута, будут доступны вместе с параметрами запроса (exchange.getQueryParameters()). Это поведение по умолчанию. Если вы этого не хотите, вы можете создать свой обработчик маршрутизации следующим образом: Handlers.routing(false).get(...), а затем получить параметры из вложений обмена.

Для любого маршрута, который не соответствует вашему обработчику маршрутизации, вы можете использовать fallbackHandler, доступный в RoutingHandler.

Handlers.routing() 
     .get("/", handler1) 
     .get("/index.html", handler1) 
     .setFallbackHandler(handler2); 

По умолчанию 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(); 

Это приложение также служит статические файлы из файловой системы. Это удобно для обслуживания приложения javascript или статических html-файлов, например.

+0

Спасибо за ответ. Ваш ответ верен для моего примера, но я имел в виду общий способ обработки шаблона. Если у нас есть два '/ sample1/*' и '/ sample2/*', то один резервный обработчик не работает. – user1079877

+0

Я отредактировал мой ответ – aramaki

+0

Спасибо, он работает! – user1079877