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
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