Cliente HTTP em Kotlin: fazendo requisições corretamente
O desenvolvimento moderno para Android e serviços backend em Kotlin raramente acontece sem interação com APIs remotas. Criar um cliente HTTP confiável é uma tarefa básica, da qual depende a estabilidade de toda a aplicação. Neste artigo, vamos analisar como fazer requisições HTTP em Kotlin, usando as duas bibliotecas mais populares: Ktor Client e OkHttp. Você aprenderá como enviar requisições GET e POST, processar JSON, gerenciar erros e escrever código limpo e sustentável.
Por que o Ktor Client é a escolha do desenvolvedor Kotlin moderno
Ktor Client é um cliente HTTP assíncrono, criado especificamente para Kotlin pela equipe JetBrains. Ele suporta totalmente coroutines, tornando o código conciso e seguro. Ao contrário do OkHttp, o Ktor foi projetado desde o início com suporte multiplataforma: o mesmo código funciona em Android, iOS, JVM, JS e Native.
Instalação de dependências
Para trabalhar com o Ktor Client, adicione as seguintes dependências no arquivo build.gradle.kts:
dependencies { // Cliente base implementation("io.ktor:ktor-client-core:2.3.7") // Engine para JVM (OkHttp ou CIO) implementation("io.ktor:ktor-client-okhttp:2.3.7") // Para serialização JSON implementation("io.ktor:ktor-client-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") // Kotlinx Serialization implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Requisição GET simples
Vamos criar um cliente HTTP e executar uma requisição GET para uma API de teste (JSONPlaceholder):
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import kotlinx.coroutines.runBlocking
suspend fun fetchUser(userId: Int): String { val client = HttpClient { // Configuração base engine { // Configurações do engine OkHttp } } val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/users/$userId") return response.bodyAsText()}
fun main() = runBlocking { val userData = fetchUser(1) println(userData)}Observe: fetchUser é uma função suspend. Isso permite chamá-la a partir de uma coroutine sem bloquear a thread.
Requisição POST com corpo JSON
Para enviar dados no formato JSON, vamos conectar o plugin ContentNegotiation e definir uma data class:
import io.ktor.client.*import io.ktor.client.call.*import io.ktor.client.plugins.contentnegotiation.*import io.ktor.client.request.*import io.ktor.http.*import io.ktor.serialization.kotlinx.json.*import kotlinx.serialization.Serializableimport kotlinx.serialization.json.Json
@Serializabledata class Post(val userId: Int, val id: Int? = null, val title: String, val body: String)
suspend fun createPost(post: Post): Post { val client = HttpClient { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true prettyPrint = true }) } } val response: Post = client.post("https://jsonplaceholder.typicode.com/posts") { contentType(ContentType.Application.Json) setBody(post) }.body() client.close() return response}
fun main() = runBlocking { val newPost = Post(userId = 1, title = "Ktor Client", body = "Funciona perfeitamente!") val createdPost = createPost(newPost) println(createdPost)}Ponto chave: o plugin ContentNegotiation serializa automaticamente o objeto para JSON e desserializa a resposta de volta para a data class.
OkHttp — o padrão comprovado para Android
OkHttp continua sendo o padrão de facto para requisições de rede no desenvolvimento Android. Ele é rápido, confiável e suporta p