我已经实现了一个 micronautHttpClientFilter
来为对 3rd 方服务的所有请求添加一个缓存的不记名令牌,但是这个令牌会定期过期。我想使用下游 API 重新进行身份验证,并在发生这种情况时重试请求,但似乎没有明显的方法可以做到这一点。到目前为止,我只是proceed
第二次调用,但这会导致Index out of bounds
抛出错误(我认为这是应该抛出的异常,但这里的 Micronaut 中似乎存在错误)。我所拥有的最小减少如下:
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.client.exceptions.HttpClientResponseException;
import io.micronaut.http.filter.ClientFilterChain;
import io.micronaut.http.filter.HttpClientFilter;
import io.reactivex.Flowable;
import javax.inject.Inject;
interface AuthTokenProvider {
// cached
Flowable<String> fetchToken();
void invalidateToken();
}
@Filter(serviceId = "third-party-api")
public class AuthTokenFilter implements HttpClientFilter {
@Inject AuthTokenProvider tokenProvider;
private Flowable<HttpResponse<?>> buildRequestWithToken(MutableHttpRequest<?> request, ClientFilterChain chain) {
return tokenProvider.fetchToken()
.map(token -> request.bearerAuth(token))
.flatMap(chain::proceed);
}
@Override
public Flowable<HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
return buildRequestWithToken(request, chain)
.onErrorResumeNext(err -> {
System.out.println("API request failed, invalidating token and retrying");
tokenProvider.invalidateToken();
return buildRequestWithToken(request, chain);
});
}
}
谁能提出正确的方法来做到这一点?