2016-09-26 3 views
4

J'ai ce code pour le serveur:reste simple avec undertow

Undertow server = Undertow.builder() 
     .addHttpListener(8080, "localhost") 
     .setHandler(Handlers.path() 
       .addPrefixPath("/item", new ItemHandler()) 
     ) 
     .build(); 
server.start(); 

Et gestionnaire:

private class ItemHandler implements HttpHandler { 

    @Override 
    public void handleRequest(HttpServerExchange exchange) throws Exception { 
     exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json"); 
     exchange.getPathParameters(); // always null 
     //ItemModel item = new ItemModel(1); 
     //exchange.getResponseSender().send(mapper.writeValueAsString(item)); 
    } 
} 

Je veux envoyer la demande /item/10 et obtenir 10 dans mon paramètre. Comment spécifier le chemin et l'obtenir?

Répondre

2

Vous avez besoin d'un PathTemplateHandler et non un PathHandler, voir:

Undertow server = Undertow.builder() 
    .addHttpListener(8080, "0.0.0.0") 
    .setHandler(Handlers.pathTemplate() 
     .add("/item/{itemId}", new ItemHandler()) 
    ) 
    .build(); 
server.start(); 

Ensuite, dans votre ItemHandler:

class ItemHandler implements HttpHandler { 

    @Override 
    public void handleRequest(HttpServerExchange exchange) throws Exception { 
     exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json"); 

     // Method 1 
     PathTemplateMatch pathMatch = exchange.getAttachment(PathTemplateMatch.ATTACHMENT_KEY); 
     String itemId1 = pathMatch.getParameters().get("itemId"); 

     // Method 2 
     String itemId2 = exchange.getQueryParameters().get("itemId").getFirst(); 
    } 
} 

La méthode 2 fonctionne parce que Undertow fusionne les paramètres dans le chemin avec les paramètres de la requête par défaut. Si vous ne voulez pas ce comportement, vous pouvez utiliser à la place:

Handlers.pathTemplate(false)

est de même pour la RoutingHandler, ce qui est probablement ce que vous voulez utiliser éventuellement pour gérer plusieurs chemins.

Handlers.rounting() ou Handlers.routing(false)

+0

exemple Ante pour params post? –