Routing with Undertow - Skullabs/kikaha GitHub Wiki

Routing with Undertow

Undertow is the Kikaha's HTTP engine. Behind the scenes all method mapped through the uRouting API will be delegated to an undertow's HttpHandler implementation. Developers who are familiar with this API could use Kikaha to auto-deploy its HttpHandler's routes.

import io.undertow.server.*;
import io.undertow.utils.*;
import kikaha.core.api.*;
import javax.inject.*;

@Singleton
@WebResource( value="/hello/world", method="GET" )
public class HelloWorldResource implements HttpHandler {
  @Override
  public void handleRequest(final HttpServerExchange exchange) throws Exception {
    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
    exchange.getResponseSender().send("Hello World");
  }
}

The above sample code produces the same result as the example code found at the undertow.io documentation page. The kikaha.core.modules.http.WebResource maps the resource to a endpoint location and HTTP method. But, unlike what happens with regular uRouting methods (and classes), this implementation needs to be managed.

Simplified Undertow API

All information available during a HTTP request could be retrieved by the HttpServerExchange object, exposed by the Undertow's HttpHandler interface. It is also an object which you can send response back to the HTTP client. Designed to be flexible, it a low-level API which could also make code a little verbose. Kikaha provide an out-of-box abstraction that a few convenient methods that avoid developers to write verbose code. The following sample code show how is possible to use this simplified API.

import kikaha.urouting.*;
import javax.inject.*;
import io.undertow.server.*;

@Singleton
public class MySampleRedirectHttpHandler implements HttpHandler {

  @Inject UndertowHelper requestHelper;

  @Override
  public void handleRequest(final HttpServerExchange exchange) throws Exception {
    // A wrapper for HttpServerExchange
    SimpleExchange simplified = requestHelper.simplify( exchange );
    String newLocation = simplified.getRelativePath() + "/" + simplified.getQueryParam( "id", Long.class );
    simplified.sendResponse( DefaultResponse.seeOther( newLocation ) );
  }
}

In order to use the Simplified API, you should import the kikaha-urouting module on your project.