Retrofit X Ktor: Qual utilizar?

Guilherme Cardoso
4 min readJul 26, 2023

No desenvolvimento Android, existem várias bibliotecas disponíveis para realizar chamadas de rede e consumir APIs. Duas opções populares são o Retrofit e o Ktor. Neste artigo, vamos explorar essas duas bibliotecas e discutir suas características, vantagens e desvantagens. Além disso, iremos fornecer exemplos práticos de como implementar cada uma delas, desde a configuração das dependências até o código de implementação.

O que é o Retrofit?

O Retrofit é uma biblioteca de cliente HTTP para Android desenvolvida pela Square. Ela simplifica o processo de fazer chamadas de rede e consumir APIs RESTful. O Retrofit converte automaticamente as respostas HTTP em objetos Java/Kotlin, facilitando o processamento dos dados recebidos.

Exemplo prático de como implementar o Retrofit:

  1. Adicione a dependência do Retrofit ao seu projeto:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

2. Crie uma interface que defina as chamadas de API desejadas:

interface MyApiService {
// Declaração do método para obter um Pokémon pelo nome
@GET("{pokemonName}")
suspend fun getPokemonByName(
// Parâmetro: nome do Pokémon a ser pesquisado
@Path("pokemonName") pokemonName: String
): Pokemon
}

Aqui, temos um método chamado getPokemonByName que é anotado com @GET("{pokemonName}"). Essa anotação indica que ele é um método de requisição GET HTTP e possui um parâmetro pokemonName que será substituído no URL.

3. Crie uma instância do Retrofit passando a URL base da API:

// Configurando uma instância do Retrofit
val retrofit = Retrofit.Builder()
// Definindo a URL base da API
.baseUrl("<https://pokeapi.co/api/v2/pokemon/>")
// Adicionando um conversor de JSON (no caso, Gson) para converter as respostas da API em objetos Kotlin
.addConverterFactory(GsonConverterFactory.create())
// Criando a instância do Retrofit
.build()

Aqui, estamos utilizando o Retrofit.Builder() para configurar uma instância do Retrofit:

  • .baseUrl("https://pokeapi.co/api/v2/pokemon/"): Definimos a URL base da API, que será usada como prefixo para todas as chamadas de endpoint.
  • .addConverterFactory(GsonConverterFactory.create()): Adicionamos um conversor de JSON ao Retrofit, nesse caso, estamos utilizando o Gson Converter Factory. Ele será responsável por converter automaticamente as respostas da API em objetos Kotlin.
  • .build(): Por fim, chamamos o método build() para criar a instância final do Retrofit com todas as configurações definidas.

4. Use o objeto Retrofit para criar uma implementação da interface definida anteriormente:

// Criando uma instância do serviço da API usando a instância do Retrofit
val apiService = retrofit.create(MyApiService::class.java)

Aqui, apiService é uma instância do serviço da API que será usada para fazer chamadas aos endpoints da API definidos na interface MyApiService. Utilizamos o método create() da instância do Retrofit passando a classe MyApiService::class.java como argumento. Isso cria uma implementação concreta da interface MyApiService que será usada para realizar as chamadas de API desejadas no aplicativo Android.

5. Chame os métodos da interface para realizar as chamadas de API:

// Fazendo uma chamada à API para obter informações de um Pokémon específico (no caso, "bulbasaur")
val pokemon = apiService.getPokemonByName("bulbasaur")

Aqui, apiService.getPokemonByName("bulbasaur") faz a chamada ao método getPokemonByName definido na interface MyApiService, passando "bulbasaur" como argumento para o nome do Pokémon.

Vantagens do Retrofit

  • Facilidade de uso e configuração.
  • Suporte a conversão automática de respostas JSON para objetos Java/Kotlin.
  • Suporte a autenticação e manipulação de cabeçalhos HTTP.
  • Integração com outras bibliotecas populares, como o Gson e o Moshi.

Desvantagens do Retrofit

  • Requer mais configuração para chamadas de API mais complexas.

O que é o Ktor?

O Ktor é uma biblioteca assíncrona em Kotlin para construir aplicativos conectados e escaláveis, incluindo clientes e servidores HTTP. Ele oferece uma abordagem mais flexível para realizar chamadas de rede e é altamente configurável, permitindo personalizar o comportamento de acordo com suas necessidades específicas.

Exemplo prático de como implementar o Ktor:

  1. Adicione a dependência do Ktor ao seu projeto:
implementation "io.ktor:ktor-client-okhttp:2.2.4"
implementation "io.ktor:ktor-client-logging-jvm:2.2.4"
implementation "io.ktor:ktor-client-content-negotiation:2.2.4"
implementation "io.ktor:ktor-serialization-kotlinx-json:2.2.4"

2. Crie um cliente Ktor para fazer chamadas de API:

// Configurando um cliente HTTP usando a biblioteca Ktor
val client = HttpClient {
// Configurando a negociação de conteúdo
install(ContentNegotiation) {
// Utilizando o conversor Kotlinx Serialization para JSON
val converter = KotlinxSerializationConverter(Json {
prettyPrint = true
ignoreUnknownKeys = true
})
// Registrando o conversor para o tipo de conteúdo "application/json"
register(ContentType.Application.Json, converter)
}

// Configurando o log
install(Logging) {
level = LogLevel.ALL
}

// Configurando a requisição padrão
defaultRequest {
url("https://pokeapi.co/api/v2/pokemon/") // Defina uma baseUrl para ser usada nas requisições
}
}

Aqui, estamos configurando o cliente HTTP com várias características:

  • Configurando a negociação de conteúdo para lidar com JSON, usando o conversor Kotlinx Serialization Converter.
  • Registrando o conversor para o tipo de conteúdo “application/json”.
  • Configurando o log para exibir todas as mensagens de log.
  • Configurando a requisição padrão com a URL base https://pokeapi.co/api/v2/pokemon/.

3. Utilize as funções do cliente Ktor para fazer chamadas de API assíncronas:

// Fazendo uma chamada GET à API para obter informações de um Pokémon específico (no caso, "bulbasaur")
val response: Pokemon = client.get("bulbasaur").body()

Aqui, client.get("bulbasaur") faz a chamada GET para a URL https://pokeapi.co/api/v2/pokemon/bulbasaur, onde "bulbasaur" é o nome do Pokémon desejado. O método .body() é usado para extrair o corpo da resposta da chamada GET.

Vantagens do Ktor

  • Abordagem mais flexível e altamente configurável.
  • Suporte a WebSockets, gRPC, e outros protocolos além do HTTP.
  • Extensibilidade e facilidade de personalização.

Desvantagens do Ktor

  • Curva de aprendizado inicial mais íngreme.
  • Requer mais configuração e código para casos de uso simples em comparação com o Retrofit.

Conclusão

Tanto o Retrofit quanto o Ktor são ótimas opções para realizar chamadas de rede e consumir APIs no desenvolvimento Android. O Retrofit é conhecido por sua simplicidade de uso e configuração, além de sua capacidade de converter automaticamente respostas JSON em objetos Java/Kotlin. Por outro lado, o Ktor oferece uma abordagem mais flexível e altamente configurável, suportando chamadas assíncronas e uma variedade de protocolos.

A escolha entre Retrofit e Ktor depende das necessidades específicas do seu projeto. Considere a complexidade do projeto, os requisitos de desempenho e as preferências da equipe de desenvolvimento ao tomar a decisão. Ambas as bibliotecas têm suas vantagens e desvantagens, e a escolha certa dependerá do contexto em que serão utilizadas.

--

--