我一直想知道解决令牌刷新问题的最佳方法是什么。 我正在连接到一个API,它为我提供了一个auth-token,如果在调用过程中的某个时间我得到一个INVALID_AUTH,我需要重新进行身份验证。 所以对于天真的实现,我做了这个
@SuppressWarnings("unchecked")
@Override
public Observable<User> getUsers() {
return runCommandAndrefreshAuthIfNecessary(new RequestCommand() {
@Override
public Observable create() {
return createService(UsersApi.class).getUsers();
}
});
}
private Observable runCommandAndrefreshAuthIfNecessary(final RequestCommand command) {
return command.create()
.onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
return handleRefreshToken(command);
}
});
}
private Observable<?> handleRefreshToken(final RequestCommand command) {
return refreshToken().flatMap(new Func1<Boolean, Observable<?>>() {
@Override
public Observable<?> call(Boolean aBoolean) {
return command.create();
}
});
}
正如你所看到的,我只是包装了翻译命令,如果我收到错误,我运行refreshToken(),令牌刷新,我再次运行retrofit命令,所以最后Observable传回给订阅者。按预期工作。 我正在努力解决的问题是,我发出了多次调用,例如,我一个接一个地调用getUsers和getFlags。他们俩都得到了INVALID_AUTH,目前都是fire refreshToken(),这很糟糕。 我正在寻找一种rx-java方式来管理调用,这意味着在第一次调用getUsers后会激活refreshToken,之后的任何调用都需要等待refreshToken结束,然后才会触发改进命令。
任何建议都将受到赞赏。