Reference: Format: DataFrame

Installation (Gradle)

dependencies {
    
    implementation(platform("org.http4k:http4k-bom:6.36.0.0"))

    implementation("org.http4k:http4k-format-dataframe")
}

About

This module adds the ability to use Kotlin DataFrames as a first-class citizen when reading from HTTP messages. Extraction from the HTTP message body is done automatically when using a lens with a DataFrame type.

Code

Kotlin example.kt
package content.ecosystem.http4k.reference.dataframe

import org.http4k.client.JavaHttpClient
import org.http4k.core.Method.GET
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.format.dataframe.CSV
import org.http4k.format.dataframe.dataFrame
import org.http4k.format.dataframe.dataFrameCsv
import org.http4k.server.SunHttp
import org.http4k.server.asServer
import org.jetbrains.kotlinx.dataframe.api.filter

fun main() {

    // define a simple CSV endpoint
    val app = { _: Request ->
        Response(OK).body(
            """
            full_name,html_url,stargazers_count
            http4k,https://http4k.org,100
            http4k-connect,https://http4k-connect.org,10
            forkhandles,https://forkhandles.dev,20
        """.trimIndent()
        )
    }

    app.asServer(SunHttp(8000)).start()

    val response = JavaHttpClient()(Request(GET, "http://localhost:8000"))

    // load all the data into an untyped DataFrame
    val frame = response.dataFrame(CSV())

    // filter all projects starting with "h"
    val all_h_projects = frame
        .filter { it["full_name"]?.toString()?.startsWith("h") ?: false }

    println(all_h_projects)

    // you can also use the Kotlin KSP DataFrame plugin to generate typed data classes.
    // Then use the `dataFrameCsv` extension function to cast the DataFrame to a typed DataFrame

    // this is a fake class - we would the generated one in a real project and to manipulate
    // the dataframe as above
    data class Repository(val fullName: String)

    println(response.dataFrameCsv<Repository>())
}
scarf