Consumindo APIs com Retrofit

Tempo: 15 min Nível: Intermediário

O que você vai aprender

  • Configurar o Retrofit em seu projeto Android
  • Criar interfaces para endpoints de API
  • Fazer requisições GET, POST, PUT e DELETE
  • Tratar respostas e erros de forma elegante

Pré-requisitos

Conhecimento básico de: Kotlin, Android Studio e conceitos de REST APIs
Dependências necessárias
// build.gradle (Module)
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
Permissões AndroidManifest
<uses-permission android:name="android.permission.INTERNET" />

Passo 1: Configurando o Retrofit

Crie uma classe singleton para gerenciar sua instância do Retrofit:

RetrofitClient.kt
object RetrofitClient {
    private const val BASE_URL = "https://api.exemplo.com/v1/"
    
    val instance: Retrofit by lazy {
        val logging = HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }
        
        val client = OkHttpClient.Builder()
            .addInterceptor(logging)
            .build()
            
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
}
Dica: O interceptor de logging é ótimo para debug, mas remova ou defina como Level.NONE em produção.

Passo 2: Definindo a Interface da API

Crie uma interface com os endpoints que você deseja consumir:

ApiService.kt
interface ApiService {
    @GET("posts")
    suspend fun getPosts(): Response<List<Post>>
    
    @GET("posts/{id}")
    suspend fun getPostById(@Path("id") id: Int): Response<Post>
    
    @POST("posts")
    suspend fun createPost(@Body post: Post): Response<Post>
    
    @FormUrlEncoded
    @POST("login")
    suspend fun login(
        @Field("email") email: String,
        @Field("password") password: String
    ): Response<AuthResponse>
}

Modelo de Dados

data class Post(
    val id: Int,
    val userId: Int,
    val title: String,
    val body: String
)

data class AuthResponse(
    val token: String,
    val user: User
)

Passo 3: Fazendo Requisições

Exemplo completo de como consumir a API em uma ViewModel:

PostViewModel.kt
class PostViewModel : ViewModel() {
    private val api = RetrofitClient.instance.create(ApiService::class.java)
    
    private val _posts = MutableLiveData<List<Post>>()
    val posts: LiveData<List<Post>> = _posts
    
    private val _error = MutableLiveData<String>()
    val error: LiveData<String> = _error
    
    fun fetchPosts() {
        viewModelScope.launch {
            try {
                val response = api.getPosts()
                if (response.isSuccessful) {
                    _posts.value = response.body()
                } else {
                    _error.value = "Erro: ${response.code()}"
                }
            } catch (e: Exception) {
                _error.value = "Falha na rede: ${e.message}"
            }
        }
    }
}
Como usar na Activity
viewModel.posts.observe(this) { posts ->
    adapter.submitList(posts)
}

viewModel.error.observe(this) { error ->
    Toast.makeText(this, error, Toast.LENGTH_SHORT).show()
}

// Disparar a requisição
viewModel.fetchPosts()
Exemplo de Resposta
// GET /posts
[
  {
    "id": 1,
    "title": "Introdução ao Retrofit",
    "body": "Este é um tutorial sobre...",
    "userId": 1
  }
]

Recursos

Projeto Completo

Código-fonte do exemplo completo

Baixar ZIP
Cheat Sheet

Guia rápido de referência

Baixar PDF
Conclusão
O que aprendemos:
  • Como configurar o Retrofit em um projeto Android
  • Padrões para organizar chamadas de API
  • Tratamento de erros e respostas
  • Boas práticas para consumo de APIs REST

Próximos passos: