Introdução
Kotlin é uma linguagem de programação moderna que está ganhando popularidade rapidamente no desenvolvimento backend. Graças à sua sintaxe concisa, compatibilidade total com Java e ferramentas poderosas como o framework Ktor, escrever uma REST API em Kotlin leva literalmente 30 minutos. Neste artigo, criaremos uma REST API completa para gerenciar uma lista de tarefas (Todo API). Você aprenderá a configurar o projeto, criar endpoints, conectar um banco de dados e testar a API. Sem teoria desnecessária — apenas prática.
Passo 1: Configuração do projeto e dependências
Para um início rápido, usaremos o IntelliJ IDEA (Community Edition) ou qualquer outro editor. Criaremos um novo projeto Gradle com Kotlin DSL.
Criação da estrutura do projeto
Adicione as seguintes dependências ao arquivo build.gradle.kts:
plugins { kotlin("jvm") version "1.9.22" application}
repositories { mavenCentral()}
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") implementation("org.jetbrains.exposed:exposed-core:0.44.1") implementation("org.jetbrains.exposed:exposed-dao:0.44.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1") implementation("com.h2database:h2:2.2.224") implementation("ch.qos.logback:logback-classic:1.4.14")}
application { mainClass.set("ApplicationKt")}Estamos usando:
- Ktor — um framework assíncrono leve para servidores HTTP.
- Exposed — ORM para trabalhar com bancos de dados.
- H2 — banco de dados embutido para desenvolvimento.
- Kotlinx.serialization — para trabalhar com JSON.
Passo 2: Criação do modelo de dados e conexão com o BD
Vamos definir a estrutura da tabela de tarefas. Crie o arquivo Database.kt:
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.insertimport org.jetbrains.exposed.sql.selectAllimport org.jetbrains.exposed.sql.transactions.transaction
object Tasks : Table() { val id = integer("id").autoIncrement() val title = varchar("title", 255) val completed = bool("completed").default(false)
override val primaryKey = PrimaryKey(id)}
data class Task(val id: Int, val title: String, val completed: Boolean)
fun initDatabase() { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { SchemaUtils.create(Tasks) }}Este código cria a tabela Tasks com três campos: id, title e completed. A função initDatabase() inicializa o banco de dados em memória.
Passo 3: Escrita dos controladores REST API
Agora criaremos o arquivo principal da aplicação Application.kt. Aqui definiremos todos os endpoints.
Configuração básica do servidor
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.server.request.*import io.ktor.serialization.kotlinx.json.*import io.ktor.server.plugins.contentnegotiation.*
fun main() { embeddedServer(Netty, port = 8080) { install(ContentNegotiation) { json() } initDatabase() configureRouting() }.start(wait = true)}Implementação dos endpoints CRUD
fun Application.configureRouting() { routing { // Obter todas as tarefas get("/tasks") { val tasks = transaction { Tasks.selectAll().map { row -> Task( id = row[Tasks.id],