Search⌘ K
AI Features

Fetching new Entities

Explore fetching new entities in a Ktor-based microservice application using Kotlin. Understand how to set up RESTful routes to retrieve single or multiple cats from a database, handle JSON serialization with Kotlin serialization plugin, and write robust tests to validate your endpoints using the Exposed SQL library. This lesson guides you through practical implementation and testing strategies for database interactions in concurrent microservices.

We'll cover the following...

Following the REST practices, the URL for fetching all cats should be /cats, while for fetching a single cat, it should be /cats/123, where 123 is the ID of the cat we are trying to fetch all the rows from the table for. Then, we map each row to our data class.

Adding new routes to the App.kt file:

Let’s add two new routes for that in the App.kt:

get("/cats") {
   ...
}
get("/cats/{id}") {
   ...
}

The first route is very similar to the /status route we introduced earlier in this chapter. But the second round is slightly different: it uses a query parameter in the URL. You can recognize query parameters by the curly brackets around their name.

To read a query parameter, we can access the parameters map:

val id = requireNotNull(call.parameters["id"]).toInt()

If there is an ID on the URL, we need to try and fetch a cat from the database:

val cat = transaction {
    CatsTable.select {
        CatsTable.id.eq(id)
    }.firstOrNull()
}

Here, we open a transaction and use the select statement to get a cat with an ID equal to what we were provided previously.

If an object was returned, we would convert it into JSON. Otherwise, we would return an HTTP code of 404 Not Found:

if (row == null) {
    call.respond(HttpStatusCode.NotFound)
} else {
    call.respond(
        Cat(
            row[CatsTable.id].value,
            row[CatsTable.name],
            row[CatsTable.age]
        )
    )
}
...