Suas ideias em realidade digital!
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á:
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'
data class LoginRequest(
val email: String,
val password: String
)
data class LoginResponse(
val token: String,
val token_type: String,
val expires_in: Int
)
interface ApiService {
@POST("auth/login")
fun login(@Body request: LoginRequest): Call<LoginResponse>
@GET("posts")
fun getPosts(@Header("Authorization") token: String): Call<List<Post>>
}
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)
}
}
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 ?: "")
}
})
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)
}
}
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")
}
}
Se você ainda não configurou o backend, veja: