Reference: Servers

Installation (Gradle)

dependencies {
    { { < http4k_bom > } }
    // Apache v5: 
    implementation("org.http4k:http4k-server-apache")

    // Apache v4: 
    implementation("org.http4k:http4k-server-apache4")

    // Jetty & JettyLoom: 
    implementation("org.http4k:http4k-server-jetty")

    // Jetty11 & Jetty11Loom: 
    implementation("org.http4k:http4k-server-jetty11")

    // Helidon (Loom): 
    implementation("org.http4k:http4k-server-helidon")

    // Ktor CIO: 
    implementation("org.http4k:http4k-server-ktorcio")

    // Ktor Netty: 
    implementation("org.http4k:http4k-server-ktornetty")

    // Netty: 
    implementation("org.http4k:http4k-server-netty")

    // Ratpack: 
    implementation("org.http4k:http4k-server-ratpack")

    // Servlet: 
    implementation("org.http4k:http4k-server-servlet")

    // Undertow: 
    implementation("org.http4k:http4k-server-undertow")

    // Java WebSocket:
    implementation("org.http4k:http4k-server-websocket")

    // SunHttp & SunHttpLoom (for development only): 
    implementation("org.http4k:http4k-core")
}

About

Server-backend modules provide a consistent API to mount HttpHandlers into the specified container in 1 LOC, by simply passing it to the relevant ServerConfig implementation (in this case Jetty):

Feature support

http4k provides support for the following Server backends:

ServerHTTPWebSocketsSSEVirtual ThreadsNotes
Apache
Apache 4Legacy
Helidon
Jetty
Jetty 11Legacy
Ktor CIO
Ktor Netty
Netty
Ratpack
Servlets
SunHttpNon-production
Undertow
Websocket

Code

package content.ecosystem.http4k.reference.servers

import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.server.Jetty
import org.http4k.server.asServer

fun main() {
    { _: Request -> Response(OK).body("Hello World") }.asServer(Jetty(8000)).start()
}

Servlets

To mount any HttpHandler in a container, you can install the http4k-server-servlet dependency and then simply be converted to a Servlet by calling handler.asServlet()

Customisation

Each of the server backends implement an interface ServerConfig, which is written with sensible defaults for the server in questions, but is also designed to be used as a starting point for tweaking to API user needs. To customize, simply use the relevant ServerConfig class as a starting point and reimplement as required. See the how-to guides for an example of this in use.