Il y a deux façons d'y parvenir:
1) Approche de base: PathHandler
Handlers.path()
.addExactPath("/path1", handler1)
.addPrefixPath("/path2", handler2);
Le handler1
correspondra uniquement sur /chemin1 (ou /chemin1/).
Le handler2
correspondra à /path2, /chemin2/ et tout le reste qui commence par /chemin2/.
2) approche Route: RoutingHandler
Si vous utilisez un RoutingHandler
, vous avez la possibilité d'extraire facilement les variables des chemins. C'est pratique pour construire des API REST par exemple (notez l'utilisation de la méthode pratique get
sur le 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("*")
}))
Le paramètre *
peut correspondre à quelque chose (comme un chemin par exemple a/b/c
). Pour utiliser le paramètre *
, vous avez besoin d'un paramètre nommé réel défini auparavant dans le modèle d'itinéraire (test
dans mon exemple).
Notez que les paramètres définis dans votre modèle d'itinéraire seront disponibles avec les paramètres de requête (exchange.getQueryParameters()
). C'est le comportement par défaut. Si vous ne le souhaitez pas, vous pouvez créer votre gestionnaire de routage comme ceci: Handlers.routing(false).get(...)
, puis récupérer les paramètres des pièces jointes de l'échange.
Pour tout itinéraire qui ne correspond pas par votre gestionnaire de routage, vous pouvez utiliser le fallbackHandler
disponible dans le RoutingHandler
.
Handlers.routing()
.get("/", handler1)
.get("/index.html", handler1)
.setFallbackHandler(handler2);
Par défaut, le fallbackHandler
retourne simplement un corps de réponse vide avec un code d'état 404. Le handler2
correspondra à toutes les autres demandes, non seulement GET demandes.
complète Exemple
Vous pouvez bien sûr combiner PathHandler
et RoutingHandler
pour répondre à vos besoins.
Voici un petit exemple d'une configuration plus réaliste:
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();
Cette application sert également les fichiers statiques de votre système de fichiers. C'est pratique pour servir une application javascript ou des fichiers html statiques par exemple.
Merci pour votre réponse. Votre réponse est correcte pour mon exemple, mais je voulais dire une façon générale de gérer les caractères génériques. Si nous avons deux '/ sample1/*' et '/ sample2/*', le gestionnaire de secours unique ne fonctionne pas. – user1079877
J'ai édité ma réponse – aramaki
Merci, ça marche! – user1079877