Cliente HTTP em Kotlin: fazendo requisições corretamente: do A ao Z
O desenvolvimento moderno em Kotlin é impensável sem interação de rede. Seja um aplicativo Android, uma solução de servidor com Ktor ou um aplicativo desktop — as requisições HTTP continuam sendo a principal forma de troca de dados. Neste artigo, vamos analisar como organizar corretamente um cliente HTTP em Kotlin, explorar bibliotecas populares e melhores práticas.
Por que Kotlin é ideal para requisições HTTP?
Kotlin oferece sintaxe moderna, segurança contra nulos e total compatibilidade com o ecossistema Java. Graças às corrotinas e APIs baseadas em fluxo, o trabalho com rede se torna limpo e assíncrono. Principais vantagens:
- Corrotinas — threads leves para operações assíncronas sem bloqueios
- Type-safe builders — construção conveniente de requisições HTTP
- Sealed classes — tratamento elegante de estados de resposta
- Extension functions — extensão da funcionalidade das bibliotecas
Escolha do cliente HTTP para Kotlin
Atualmente, três bibliotecas dominam o ecossistema Kotlin: OkHttp, Ktor Client e Retrofit. Vamos analisar cada uma com exemplos de código.
1. OkHttp — uma escolha testada pelo tempo
OkHttp da Square é o cliente HTTP mais popular para JVM. Ele é eficiente, suporta HTTP/2, compressão automática e cache.
// build.gradle.ktsimplementation("com.squareup.okhttp3:okhttp:4.12.0")
// Exemplo de requisição GET com OkHttpimport okhttp3.OkHttpClientimport okhttp3.Requestimport kotlinx.coroutines.Dispatchersimport kotlinx.coroutines.withContext
class OkHttpExample { private val client = OkHttpClient.Builder() .connectTimeout(30, java.util.concurrent.TimeUnit.SECONDS) .readTimeout(30, java.util.concurrent.TimeUnit.SECONDS) .build()
suspend fun fetchData(url: String): String = withContext(Dispatchers.IO) { val request = Request.Builder() .url(url) .header("Accept", "application/json") .build()
client.newCall(request).execute().use { response -> if (!response.isSuccessful) { throw RuntimeException("Erro: ${response.code}") } response.body?.string() ?: throw RuntimeException("Resposta vazia") } }}2. Ktor Client — a escolha nativa para Kotlin
Ktor Client faz parte do ecossistema JetBrains, totalmente escrito em Kotlin com suporte multiplataforma. Ideal para servidores Ktor e projetos Android/iOS.
// build.gradle.ktsimplementation("io.ktor:ktor-client-core:2.3.7")implementation("io.ktor:ktor-client-cio:2.3.7")implementation("io.ktor:ktor-client-content-negotiation:2.3.7")implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
import io.ktor.client.*import io.ktor.client.call.*import io.ktor.client.engine.cio.*import io.ktor.client.plugins.contentnegotiation.*import io.ktor.client.request.*import io.ktor.client.statement.*import io.ktor.serialization.kotlinx.json.*import kotlinx.serialization.Serializable
@Serializabledata class Post(val userId: Int, val id: Int, val title: String, val body: String)
class KtorExample { private val client = HttpClient(CIO) { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true isLenient = true }) } engine { requestTimeout = 30_000 } }
suspend fun getPost(id: Int): Post { val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/$id") return response.body() }
suspend fun createPost(post: Post): Post { val response: HttpResponse = client.post("https://jsonplaceholder.typicode.com/posts") { setBody(post)