I user Springboot3 new http rpc framwork to write a http remote call, and the remote server need a sign in header which generate by httpmethod, headers, url, body. And i user ExchangeFilterFunction to generate header but I found it difficult for me to get request Body from ClientRequest. Is there any good solution?

There is my code

@Configuration(proxyBeanMethods = false)
public class WebApiConfig {

   @Autowire
   private WebApiConfiguration webApiConfiguration;

    @Bean
    public ClustersApiService clustersApiService() {
        WebClient client = getClientBuilder().baseUrl(webApiConfiguration.getBaseUrl()).build();
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory.createClient(ClustersApiService.class);
    }

    private WebClient.Builder getClientBuilder() {

        ExchangeStrategies strategies = ExchangeStrategies
                .builder()
                .codecs(clientDefaultCodecsConfigurer -> {
                    clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonEncoder(
                            new Jackson2JsonEncoder(getObjectMapper(), MediaType.APPLICATION_JSON));
                    clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonDecoder(
                            new Jackson2JsonDecoder(getObjectMapper(), MediaType.APPLICATION_JSON));

                }).build();

        return WebClient.builder()
                        .defaultHeader("Content-Type", "application/json")
                .exchangeStrategies(strategies)
                        .filter(ExchangeFilterFunction.ofRequestProcessor(request -> {
                            BodyInserter<?, ? super ClientHttpRequest> body = request.body();
                            String authToken = getSign(request);
                            return Mono.just(ClientRequest.from(request).header("AUTH-TOKEN", authToken).build());
                        }));
    }

    private String getSign(ClientRequest request)  {
        String name = request.method().name();
        String url = request.url().toString();
        StringBuilder headerStr = new StringBuilder();
        request.headers().forEach((key, value) -> headerStr.append(key).append("=").append(value).append(";"));

        String body = getBody(request);
        String str = name + url + headerStr + body;
        return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));
    }

    // TODO get body
    private String getBody(ClientRequest request) {
        return "";
    }
}

I follow the way from https://stackoverflow.com/questions/61156827/hot-to-get-body-as-string-from-spring-reactive-clientrequest and it's too complicated. Is there any easy way to achieve get requestBody from ClientRequest

Comment From: bclozel

Closing as a duplicate of #24425