🧩 Exercícios - Cap 20: Login na Arena: Auth e Tokens
🎯 Antes de começar
No Cap 20 você criou gerarHeader (Prática 1), entendeu a expiração de tokens (Prática 2) e criou LogInterceptor (Prática 3), além do AuthInterceptor do exemplo. Depois de completar as três Práticas, faça o exercício extra abaixo para usar os dois interceptors juntos na mesma chamada Retrofit.
💪 Exercício Extra 1: Combinando Interceptors — Auth + Log (15 min)
Objetivo: Registrar AuthInterceptor e LogInterceptor no mesmo OkHttpClient.Builder(), entendendo que cada addInterceptor adiciona um elo na corrente de requisições.
Passos:
- Crie a função
criarRetrofitComLog, baseada emcriarRetrofit, mas adicionando dois interceptors:fun criarRetrofitComLog(token: String): Retrofit { val client = OkHttpClient.Builder() .addInterceptor(AuthInterceptor(token)) .addInterceptor(LogInterceptor()) .build() return Retrofit.Builder() .baseUrl("https://meu-jogo.beeceptor.com/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() } - Chame
criarRetrofitComLog("pokedex_gold_2026")e faça (ou simule) uma chamada à API.
✅ Resultado Esperado
- Toda chamada feita por esse
Retrofitpassa pelos dois interceptors:- O
AuthInterceptoradiciona o cabeçalhoAuthorization: Bearer pokedex_gold_2026à requisição. - O
LogInterceptorimprime no console📡 Chamando: https://meu-jogo.beeceptor.com/...para cada requisição.
- O
- A ordem em que você chama
.addInterceptor(...)define a ordem em que eles processam a requisição — cada um chamachain.proceed(...)para passar a requisição ao próximo elo da corrente.
🆘 Resolução de Problemas Comuns
| Erro | Causa | Solução |
|---|---|---|
| Apenas um dos comportamentos acontece (só o log, ou só o token) | Apenas um .addInterceptor(...) foi chamado |
Chame .addInterceptor(...) duas vezes — uma para cada interceptor, encadeados no OkHttpClient.Builder() |
Unresolved reference: AuthInterceptor ou LogInterceptor |
As classes foram criadas em outro arquivo/pacote e não foram importadas | Garanta que AuthInterceptor (exemplo do capítulo) e LogInterceptor (Prática 3) estejam acessíveis no mesmo arquivo ou com o import correto |
Erro must override 'intercept' |
A classe LogInterceptor não implementa corretamente Interceptor |
Confirme class LogInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { ... } } |