2016-09-28 5 views
3

Existe-t-il une documentation sur le format de gabarit de routage pour le sous-flux. Je veux des gestionnaires de configuration comme celle-ci:Format de gabarit de routage pour le sous-flux

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

J'ai essayé celui-ci, bu ne fonctionne pas:

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

Toute idée?

Répondre

11

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.

+0

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

+0

J'ai édité ma réponse – aramaki

+0

Merci, ça marche! – user1079877