Mam ViewPager
i trzy wywołania usługi sieciowej są wykonywane, gdy ViewPager
jest ładowany jednocześnie.Okhttp odroczyć wygasły token, gdy wiele żądań jest wysyłanych na serwer
Kiedy pierwszy zwraca 401, Authenticator
nazywa i odświeżyć token wewnątrz Authenticator
, ale pozostałe 2 wnioski zostały już wysłane do serwera ze starego odświeżania żeton i nie powiedzie się z 498, które jest zrobione w Interceptor i aplikacja jest wylogowany.
Nie jest to idealne zachowanie, jakiego oczekiwałbym. Chciałbym zatrzymać drugie i trzecie żądanie w kolejce, a gdy token zostanie odświeżony, ponowić żądanie kolejkowania.
Obecnie mam zmienną wskazującą, czy odświeżenie tokena trwa w Authenticator
, w tym przypadku anuluję wszystkie kolejne żądania w Interceptor
i użytkownik musi ręcznie odświeżyć stronę lub mogę wylogować użytkownika i zmusić użytkownika do Zaloguj Się.
Co to jest dobre rozwiązanie lub architektura powyższego problemu za pomocą okhttp 3.x na Androida?
EDYCJA: Problem, który chcę rozwiązać, jest generalny i nie chciałbym sekwencjonować połączeń. tj. czekać na jedno połączenie, aby zakończyć i odświeżyć token, a następnie wysłać tylko resztę żądania na poziomie aktywności i fragmentu.
Żądano kodu. To Norma Authenticator
:
public class CustomAuthenticator implements Authenticator {
@Inject AccountManager accountManager;
@Inject @AccountType String accountType;
@Inject @AuthTokenType String authTokenType;
@Inject
public ApiAuthenticator(@ForApplication Context context) {
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Invaidate authToken
String accessToken = accountManager.peekAuthToken(account, authTokenType);
if (accessToken != null) {
accountManager.invalidateAuthToken(accountType, accessToken);
}
try {
// Get new refresh token. This invokes custom AccountAuthenticator which makes a call to get new refresh token.
accessToken = accountManager.blockingGetAuthToken(account, authTokenType, false);
if (accessToken != null) {
Request.Builder requestBuilder = response.request().newBuilder();
// Add headers with new refreshToken
return requestBuilder.build();
} catch (Throwable t) {
Timber.e(t, t.getLocalizedMessage());
}
}
return null;
}
}
Niektóre pytania podobne do tego: OkHttp and Retrofit, refresh token with concurrent requests
proszę napisać jakiś kod –
czy możesz zamieścić swój kod uwierzytelniający? dzięki. także dlaczego otrzymujesz 498 z api z wygasłym tokenem? – savepopulation
@suppopulation 498 oznacza Nieprawidłowy token. 2 żądania, które zostały wysłane razem z pierwszym żądaniem mają stary token i żądanie kończy się niepowodzeniem z 498 kodem błędu. – sat