作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从 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/
我是一名优秀的程序员,十分优秀!