Cliente HTTP em Kotlin: fazendo requisições corretamente do A ao Z
\nO desenvolvimento moderno em Kotlin é impensável sem interação com servidores remotos. Seja um aplicativo móvel Android ou uma solução de servidor com Ktor — as requisições HTTP são a base da troca de dados. Neste artigo, vamos explorar como criar clientes HTTP em Kotlin, usando as melhores práticas, bibliotecas populares e uma abordagem moderna com corrotinas. Você aprenderá como fazer requisições GET e POST, tratar erros, trabalhar com JSON e construir uma arquitetura robusta de camada de rede.
\n\nPor que Kotlin é ideal para clientes HTTP?
\nKotlin oferece sintaxe concisa, segurança contra nulos (null safety) e compatibilidade total com o ecossistema Java. Graças às corrotinas (coroutines), as requisições assíncronas se tornam intuitivas, sem callbacks complexos. Você pode escrever código sequencial que é executado de forma assíncrona — isso simplifica muito a leitura e a depuração. Além disso, Kotlin é amplamente utilizado no desenvolvimento Android, onde requisições de rede são tarefas diárias.
\n\nPrincipais bibliotecas para HTTP em Kotlin
\nAtualmente, as três abordagens mais populares são:
\n- \n
- Ktor Client — cliente multiplataforma da JetBrains. Suporta JVM, Android, iOS, JS e Native. Ideal para projetos que precisam de uma base de código unificada. \n
- OkHttp + Retrofit — stack clássico para Android/JVM. OkHttp cuida do trabalho de rede de baixo nível, enquanto Retrofit gera interfaces tipadas. \n
- Fuel — biblioteca leve com abordagem funcional. Adequada para projetos pequenos. \n
Neste artigo, focaremos em Ktor e OkHttp, pois eles cobrem 90% dos cenários.
\n\nConfiguração do projeto e primeiras requisições
\nPara começar, vamos adicionar as dependências. Se você usa Gradle (Kotlin DSL), adicione o Ktor Client:
\ndependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-cio:2.3.7") // motor CIO\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\nPara OkHttp, as dependências serão:
\ndependencies {\n implementation("com.squareup.okhttp3:okhttp:4.12.0")\n implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\nRequisição GET com Ktor Client
\nVamos criar um cliente simples e fazer uma requisição GET a uma API pública:
\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\n\nsuspend fun fetchData(): String {\n val client = HttpClient()\n val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/1")\n val body = response.bodyAsText()\n client.close()\n return body\n}\n\n// Uso em uma corrotina\nfun main() = runBlocking {\n println(fetchData())\n}\nObserve: suspend é a palavra-chave do Kotlin para funções suspensíveis. Isso permite executar a requisição sem bloquear a thread.
Requisição GET com OkHttp
\nUm exemplo semelhante com OkHttp fica assim:
\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\n\nfun fetchDataSync(): String {\n val client = OkHttpClient()\n val request = Request.Builder()\n .url("https://jsonplaceholder.typicode.com/posts/1")\n .build()\n client.newCall(request).execute().use { response ->\n return response.body?.string() ?: "Erro"\n }\n}\n\n// Chamada em uma thread normal (bloqueante)\nfun main() {\n println(fetchDataSync())\n}\nOkHttp é síncrono por padrão, mas pode ser facilmente adaptado para corrotinas usando suspendCancellableCoroutine.
Requisições POST e trabalho com JSON
\nO envio de dados é a segunda operação mais importante. Vamos ver como enviar JS