Как я могу повторить запросы клиентов HTTP в HttpClientFilter, используя Micronaut? - PullRequest
0 голосов
/ 06 апреля 2020

Я реализовал микронавт HttpClientFilter, чтобы добавить кэшированный токен-носитель для всех запросов к сторонней службе, однако срок действия этого токена истекает довольно регулярно. Я хотел бы повторно подтвердить подлинность с помощью нижестоящего 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);
                });
    }
}

Может кто-нибудь предложить правильный способ сделать это?

...