Introdução
Kotlin é uma linguagem de programação moderna, concisa e segura que está ganhando popularidade no desenvolvimento de aplicações server-side. Graças à sua compatibilidade com Java e frameworks poderosos, como Ktor, você pode criar uma API REST completa em literalmente meia hora. Neste artigo, mostraremos como escrever uma API REST em Kotlin usando o framework Ktor, mesmo que você seja iniciante.
Criaremos uma aplicação simples para gerenciar uma lista de tarefas (Todo API) com suporte a operações CRUD: criação, leitura, atualização e exclusão. Todo o processo levará no máximo 30 minutos, se você seguir as instruções.
1. Preparação do projeto e dependências
Para começar, você precisará do IntelliJ IDEA (Community Edition) e do Gradle. Vamos criar um novo projeto Kotlin com suporte a Ktor.
Passo 1: Criando um projeto Gradle
Abra o IntelliJ IDEA e crie um novo projeto: File → New → Project. Selecione Gradle e especifique o idioma Kotlin. Clique em Finish.
Passo 2: Adicionando dependências do Ktor
Abra o arquivo build.gradle.kts e adicione as seguintes dependências:
plugins { kotlin("jvm") version "1.9.0" application}
repositories { mavenCentral()}
dependencies { implementation("io.ktor:ktor-server-core:2.3.0") implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-content-negotiation:2.3.0") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0") implementation("ch.qos.logback:logback-classic:1.4.11")}
application { mainClass.set("ApplicationKt")}Clique no botão Sync Now no canto superior direito para baixar as dependências.
2. Criando o modelo de dados e o serviço
Antes de escrever as rotas, vamos definir o modelo de dados para nossa tarefa e um serviço simples para armazenar dados em memória.
Modelo TodoItem
Crie o arquivo TodoItem.kt na pasta src/main/kotlin:
import kotlinx.serialization.Serializable
@Serializabledata class TodoItem( val id: Int, val title: String, val completed: Boolean = false)Serviço TodoService
Crie o arquivo TodoService.kt:
import java.util.concurrent.atomic.AtomicInteger
class TodoService { private val items = mutableListOf<TodoItem>() private val idCounter = AtomicInteger(1)
fun getAll(): List<TodoItem> = items.toList()
fun getById(id: Int): TodoItem? = items.find { it.id == id }
fun create(title: String): TodoItem { val newItem = TodoItem(id = idCounter.getAndIncrement(), title = title) items.add(newItem) return newItem }
fun update(id: Int, title: String?, completed: Boolean?): TodoItem? { val index = items.indexOfFirst { it.id == id } if (index == -1) return null val current = items[index] val updated = current.copy( title = title ?: current.title, completed = completed ?: current.completed ) items[index] = updated return updated }
fun delete(id: Int): Boolean = items.removeAll { it.id == id }}3. Configuração do servidor e rotas
Agora vamos criar o arquivo principal da aplicação Application.kt e definir as rotas da API REST.
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, host = "0.0.0.0") { configureSerialization() configureRouting() }.start(wait = true)}
fun