0

基于已在 webfilter 上添加的国家/地区,我需要将请求修改到不同的服务器。

我已经将带有 webfilter 的上下文添加到了链中,我可以在这里看到它,但是我没有找到如何根据链上的信号上下文修改接收到的 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();
4

2 回答 2

2

我找到了一种方法,它正在实现一个 custom 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);
                    }
                ))
于 2020-06-17T12:09:07.110 回答
0

Mono.subscriberContext()已弃用并将在 Spring Reactor 3.5 中删除。改为使用Mono.deferContextual()

在你的情况下:

WebClient.filter((request, next) -> 
  Mono.deferContextual(ctx -> {
    ClientRequest cr = ClientRequest.from(request)
    // manipulate request to the new prefix server
    // from the ctx signal.
    .build();
    return next.exchange(cr);
  })
);
于 2021-12-09T11:57:35.403 回答