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

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

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

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

    override fun onFailure(call: Call<LoginResponse>, 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: