Akka-http Common Operations: Reference + Examples

Last updated:

WIP Alert This is a work in progress. Current information is correct but more content will probably be added in the future.

Unless otherwise noted, all examples have been run on Akka version 2.4.x (will probably work on later versions too)

Extract Query String Parameters as a Map

def myRoute1: Route = {
  extract(ctx => ctx.request.uri.query()) { queryStringParams =>
  val params = queryStringParams.toMap
  // use them

Extract body contents

def myRoute2: Route = {
  extract(ctx => ctx.request) { request =>

    // toStrict retruns a future because the body contents may be very large
    request.entity.toStrict(TimeHelper.defaultStreamTimeout).map { materializedStream =>
    val data = materializedStream.data.utf8String

    //use data

Map a request context through an arbitrary function

A generic function that you can use to modify the request context before you start processing it.

For example, I use this to remove authorization parameters from the query string, because I don't need them anymore once the request has been authorized.

// note the function signature: this function returns a 
// function of type (RequestContext => RequestContext)
def dropParam(paramName: String): (RequestContext => RequestContext) = { ctx =>

    // ctx is short for context
    val queryStringParams = ctx.request.uri.query()

    // parameter that matches the name provided is removed
    // (if it exists)
    val parameterRemoved = query.toMap.filterKeys(key => key != paramName)

    // build the new query
    val newQuery = Query(parameterRemoved)

    // but we need a Uri which is something that wraps the Query
    val newUri = ctx.request.uri.withQuery(newQuery)

    // return the modified context
    ctx.withRequest(ctx.request.withUri(newUri))
}

After creating the function, as above, you can use it when declaring routes, using mapRequestContext, which takes a mapper function as parameter:

// say you have a param called AUTH that you want to drop form the query string:
pathPrefix("foo"){
    mapRequestContext(dropParam("AUTH")){
        path("bar"){
            get{
                // handle the request here. parameter "AUTH" will not be here
            }
        }
    }
}

See also

Dialogue & Discussion