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