Как создать перехватчик для ошибок, чтобы сделать еще один вызов? - PullRequest
0 голосов
/ 13 марта 2019

Я получаю 401, потому что срок действия токена истек, поэтому мне нужно обновить токен другим вызовом, а затем повторить вызов, есть простой способ вместо:

disposable = loginService.login(
                UserToLoginRequest(
                    input_email_login.text.toString(),
                    input_password_login.text.toString(),
                    generateRandomDeviceInfo()
                )
            )
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                    { result ->
                        //It works
                    },
                    { error -> if(error.code == 401) renewAccessToken() }
                )

Дело в том, что я хочу сделать что-то вроде этого парня: Обновление токена клятвы , но если возможно снова вызвать ту же конечную точку с теми же параметрами.

Пример

getApple(1) <- вернуть информацию об идентификаторе яблока 1 </p>

Результат 401 <- не может выполнить вызов без обновления accessToken <code>refreshAccessToken()

Автоматический вызов getApple(1)не мешая пользователю

1 Ответ

0 голосов
/ 13 марта 2019
class Inceptor : Interceptor {
    internal var token: String?=null
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {

        var request=chain.request()
        request=request.newBuilder().build()

        val response=chain.proceed(request)


                if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
                    // get a new token (I use a synchronous Retrofit call)

                        val requestBody=FormBody.Builder()
                                .add("UserName", “abcd")
                                .add("Password", “*****")

                                .build()
                        val newRequest=request.newBuilder()
                                .url("Put your url")
                                .post(requestBody)
                                .build()
                        val tokenRefreshResponse=chain.proceed(newRequest)
                        val newRetryHttpUrl=request.url()
                        if (tokenRefreshResponse.code() == HttpURLConnection.HTTP_OK) {
                            val retryOriginaResponseBody: RequestBody

                            val builder=FormBody.Builder()
                            retryOriginaResponseBody=builder.build()
                            val retryRequest: Request
                            if (request.method() == "POST") {
                                retryRequest=request.newBuilder()
                                        .url(request.url())
                                        .post(retryOriginaResponseBody)

                                        .build()
                            } else {
                                retryRequest=request.newBuilder()
                                        .url(newRetryHttpUrl)

                                        .build()
                            }
                            val retryResponse=chain.proceed(retryRequest)
                            return retryResponse
                        } else {
                            return tokenRefreshResponse
                        }

                    }



        }
        return response
    }
}
...