Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.
Inscreva-se em nossa Newsletter
Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.
No curso Jetpack Compose: Comunicação com REST API, aprendemos como fazer a partir de um aplicação Android. Para fazer isso, utilizamos o - uma lib famosa na comunidade Android -, porém, vimos que temos uma possibilidade de implementação semelhante com o - uma lib desenvolvida em Kotlin e baseada em Coroutines!
Pensando em demonstrar a implementação com o Ktor, vou mostrar para você como implementar o desafio proposto no curso de REST API que pede para carregar o endereço automaticamente a partir do CEP consumindo a API do viacep, bora lá?
Passo 1: Instalando o Ktor no projeto Android
Como primeiro passo, adicione as dependências do Ktor no Android no app/build.gradle:
Agora vamos entender para que serve cada uma das dependências:
io.ktor:ktor-client-android → Engine de cliente HTTP para Android;
io.ktor:ktor-client-logging → Permite adicionar o logging das requisições feitas pelo cliente HTTP;
io.ktor:ktor-client-content-negotiation → Responsável em configurar qual o tipo de conteúdo o cliente vai lidar, por exemplo, JSON ou XML;
io.ktor:ktor-serialization-kotlinx-json → Conversor de objetos análogo ao Gson, Moshi etc;
org.slf4j:slf4j-android → Implementação de logger utilizado para realizar o logging.
Após adicionar as dependências, configure as necessárias etapas a mais para a serialização da lib io.ktor:ktor-serialization-kotlinx-json funcionar corretamente:
Adicione o plugin no app/build.gradle:
plugins {
//other plugins
id 'kotlinx-serialization'
}
Adicione repositório e dependência no classpath no build.gradle:
HttpClient → Referência de cliente HTTP do ktor para realizar as requisições;
Android → Engine que determina qual cliente HTTP será utilizado por baixo dos panos, por exemplo, HttpsUrlConnection, OkHttp etc. Essa implementação de Engine tem o foco em dar suporte para versões do Android mais antigas. Para saber mais detalhes, recomendo que consulte a documentação para conhecer as possibilidades;
install() → Instala plugins específicos ao Ktor;
Logging → Plugin para logging do cliente HTTP;
level → Determina o nível de logging do plugin - nesse caso, LogLevel.ALL seria um log mais completo;
ContentNegotiation → Plugin para configurar o content negotiation da requisição;
json() → Registra que o tipo de conteúdo da requisição ContentType é para json;
Json { } → Cria a instância de Json do serializador do Kotlin e permite configurar via lambda, como por exemplo o ignoreUnknownKeys que ignora campos desconhecidos durante o parsing.
Essa configuração é útil em situações nas quais o objeto espera apenas alguns campos do JSON de resposta; se essa configuração não for feita, uma exception é lançada durante o parsing caso o objeto não tenha todos os campos esperados.
Independente da REST API que você vai consumir, essa será a configuração base genérica.
Agora que sabemos como adicionar o Ktor em qualquer projeto Android, vamos ao projeto de exemplo que usaremos no artigo.
Passo 3: Conhecendo o projeto de exemplo do artigo
Rode o aplicativo e verifique se ele apresenta o seguinte comportamento:
Se tudo estiver rodando conforme o gif acima, prossiga para o próximo passo, pois vamos mexer neste projeto e fazer a implementação de requisição com o Ktor!
Passo 4: Implementando a requisição com o Ktor
Implementar a requisição do Ktor é similar ao Retrofit; a grande diferença é que, no Retrofit, implementamos uma interface que geralmente tem o padrão com sufixo Service:
Observe que, no Ktor, podemos utilizar uma classe em vez de uma interface (padrão do Retrofit), e também, é nesse código do Ktor em que fazemos as configurações de URL base e end-points. Agora, vamos entender o que foi feito:
get() → Faz a requisição GET a partir da URL via coroutine;
body() → Retorna o corpo da requisição de acordo com o tipo esperado, nesse caso, AddressResponse.
Caso não tenha uma referência que representa o corpo, pode retornar como String.
A configuração de injeção de dependência é feita com o Hilt, por isso temos o @Singleton e o @Inject. Inclusive, a instância do HttpClient é oferecida pela configuração do módulo RestApiModule: