Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

falha ao chamar o onFailure com retrofit

Boa noite Alex, primeiramente gostaria de dizer que seus cursos e didatica me ajudam muito na caminhada de desenvolvedor, li um artigo seu explicando como comunicar com o servidor utilizando kotlin e retrofit, porém não estou tendo exito em chamar o metodo on failure no login, quando o retorno do servidor e 200ok ele executa quando 401 por exemplo nada acontece, li um artigo seu sobre essa comunicação com retrofit e kotlin. seguem os codigos

LoginFragment


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        loginActivity = activity as LoginActivity

        txt_forgout_my_pass.setOnClickListener {
            loginActivity.openForgotPassword()
        }

        txt_create_account.setOnClickListener {
            loginActivity.toast("Criar Conta ! ")
        }
        btn_login.setOnClickListener {
            login()
        }
    }

    fun login() {

        val email = edt_login_email.text.toString().trim().takeUnless { it.isNullOrEmpty() }?.toString()
                ?: throw IllegalArgumentException("empty fields")
        val password = edt_login_password.text.toString().trim().takeUnless { it.isNullOrEmpty() }?.toString()
                ?: throw IllegalArgumentException("empty fields")


        LoginWebClient().login(email, password, object : CallbackResponse<User> {
            override fun failure(throwable: Throwable) {
                Log.e("OnFailure", "login nao realizado")
            }

            override fun success(response: User) {
                Log.e("success", "Login criado com sucesso")
                startActivity<MainActivity>()
            }


        })

    }

LoginWebClient

class LoginWebClient {
    fun login(email: String, password: String, callbackResponse: CallbackResponse<User> ) {

        val teste : String = "teste vinicius"
        Log.e("teste", teste)

        val call = RetrofitInicializer().loginService().login(email, password)
        call.enqueue(object : retrofit2.Callback<User> {

            override fun onResponse(call: Call<User>?, response: Response<User>?) {
                response?.body()?.let {
                    val userResponse: User = it
                    callbackResponse.success(userResponse)
                }
            }

            override fun onFailure(call: Call<User>?, t: Throwable?) {
                t?.message?.let {
                    callbackResponse.failure(t!!)
                    Log.e("onFailure error", t?.message)
                }

            }
        })
    }
}

RetrofiInitializer

class RetrofitInicializer() {
    private var interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
    val client : OkHttpClient.Builder = OkHttpClient.Builder().addInterceptor(interceptor)

    private val retrofit = Retrofit.Builder()
            .baseUrl("http://dev.axreg-server.anestech.com.br/app/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client.build())
            .build()

    fun loginService() = retrofit.create(LoginService::class.java)


}

LoginService

interface LoginService {

    @FormUrlEncoded
    @POST("login")
    fun login(@Field("email") email: String, @Field("password") password: String): Call<User>
}

Desde já se puder me ajudar agradeço.

1 resposta
solução!

Oi Vinicius, tudo bem?

Nesse caso você precisa realizar um tratamento direto no onResponse(), pois o status code 401 não é considerado uma falha na implementação do Retrofit.

Nessa discussão do Stack Overflow, é apresentado um exemplo de tratamento. Durante o curso de sincronização e nos artigos que escrevi, não foquei nesses casos excepcionais, porém, considerando que vai lidar com outros status codes na sua API, esse tratamento é necessário.

Veja se dá certo, caso tiver dificuldades/dúvidas com base no link que te mandei, me avisa que monto um exemplo :)

[]s