Как я могу изменить URL-адрес webClient в зависимости от контекста реактора - PullRequest
0 голосов
/ 17 июня 2020

Исходя из страны, уже добавленной в веб-фильтр, мне нужно изменить запрос на другой сервер.

Я уже добавил контекст с веб-фильтром в цепочку, я вижу его здесь, но я не нашел, как изменить полученный clientRequest на основе контекста сигнала в цепочке. Если кто-то уже нашел способ сделать это и может помочь:

return webClient
                .filter(
                        ExchangeFilterFunction
                                .ofRequestProcessor(
                                        new Function<ClientRequest, Mono<ClientRequest>>() {
                                            @Override
                                            public Mono<ClientRequest> apply(ClientRequest clientRequest) {
                                                return Mono.just(
                                                        ClientRequest.from(clientRequest).build())
                                                        .doOnEach(new Consumer<Signal<ClientRequest>>() {
                                                            @Override
                                                            public void accept(Signal<ClientRequest> signal) {
                                                                var countryContext = signal.getContext()
                                                                        .getOrEmpty(CountryContext.COUNTRY_CONTEXT_HEADER_REST).get();
                                                                System.out.println(countryContext);
                                                            }
                                                        });
                                            }
                                        }
                                )
                ).build();

1 Ответ

0 голосов
/ 17 июня 2020

Я нашел способ, он реализует пользовательский ExchangeFilterFunction и использует Mono.subscriberContext()

WebClient
    .filter((request, next) -> Mono.subscriberContext()
            .flatMap(ctx -> {
                        ClientRequest cr = ClientRequest.from(request)
                                // manipulate request to the new prefix server
                                // from the ctx signal.
                                .build();
                        return next.exchange(cr);
                    }
                ))
...