gpt4 book ai didi

java - 如何在Spring WebClient中拦截http流量?

转载 作者:行者123 更新时间:2023-12-02 09:42:07 24 4
gpt4 key购买 nike

从 DTO 转换为 JSON 字符串后,如何拦截 WebFilter 请求?

当然我可以添加一个ExchangeFilterFunction,但是clientRequest.body()只显示我的输入对象,而不是转换后的json字符串:

WebClient.builder().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).filter(logRequest()).build();

private ExchangeFilterFunction logRequest() {
return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
LOGGER.info(clientRequest.body()); //body is MyRequest.class
return Mono.just(clientRequest);
});
}

MyRequestDto dto;
client.post().uri(url).syncBody(dto).retrieve().bodyToMono(MyResponseDto.class).block();

所以我正在寻找一种方法来拦截从 dto 转换为 json 字符串后的传出请求。

反之亦然,在响应从 json 转换为 dto 之前拦截响应。

最佳答案

数据被 JacksonEncoder 写入为 String,而是写入 DataBuffer 中的字节。拦截请求的一种方法是重写 JSON 编码器,直接访问 DataBuffer 或将其解释为 String

Consumer<ClientCodecConfigurer> consumer = configurer ->
configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder() {
@Override
public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
return super.encode(inputStream, bufferFactory, elementType, mimeType, hints)
.doOnNext(dataBuffer -> System.out.println(StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer()).toString()));
}
});

WebClient webClient = WebClient.builder()
.exchangeStrategies(ExchangeStrategies.builder().codecs(consumer).build())
.build();

如果目的只是记录传出消息正文,请参阅此问题:how to log Spring 5 WebClient call

关于java - 如何在Spring WebClient中拦截http流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56987812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com