Makrosites

Suas ideias em realidade digital!

Como consumir API REST no Android usando Retrofit (exemplo completo com JWT)

Como consumir API REST no Android usando Retrofit (exemplo completo com JWT) >

Por que usar Retrofit no Android?

O Retrofit é uma das bibliotecas mais utilizadas para consumir APIs REST no Android. Ele simplifica requisições HTTP e integra perfeitamente com JSON.

Neste guia você aprenderá:


1️⃣ Dependências no build.gradle

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.3'

2️⃣ Criando o modelo de Login

data class LoginRequest(
    val email: String,
    val password: String
)

data class LoginResponse(
    val token: String,
    val token_type: String,
    val expires_in: Int
)

3️⃣ Interface da API

interface ApiService {

    @POST("auth/login")
    fun login(@Body request: LoginRequest): Call

    @GET("posts")
    fun getPosts(@Header("Authorization") token: String): Call>
}

4️⃣ Criando o Retrofit Client

object RetrofitClient {

    private const val BASE_URL = "https://www.makrosites.com.br/api/"

    val instance: ApiService by lazy {

        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        val client = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        retrofit.create(ApiService::class.java)
    }
}

5️⃣ Fazendo Login

RetrofitClient.instance.login(
    LoginRequest("admin@site.com", "123456")
).enqueue(object : Callback {

    override fun onResponse(
        call: Call,
        response: Response
    ) {
        if (response.isSuccessful) {
            val token = response.body()?.token
            Log.d("TOKEN", token ?: "")
        }
    }

    override fun onFailure(call: Call, t: Throwable) {
        Log.e("ERROR", t.message ?: "")
    }
})

6️⃣ Enviando JWT automaticamente (Interceptor)

O ideal é usar Interceptor para não precisar enviar manualmente.

class AuthInterceptor(private val token: String) : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .build()

        return chain.proceed(request)
    }
}

7️⃣ Tratando erros HTTP corretamente

if (!response.isSuccessful) {
    when (response.code()) {
        401 -> Log.e("ERROR", "Token inválido")
        403 -> Log.e("ERROR", "Acesso negado")
        500 -> Log.e("ERROR", "Erro servidor")
    }
}

Boas práticas


Integração com Backend PHP

Se você ainda não configurou o backend, veja: