java - 如何在 Spring WebClient / DataBuffer 中拦截 http 响应流量?
问题描述
如何WebClient
在 XML 响应从字节转换为 DTO 之前拦截它们?
我尝试添加一个exchangeStrategy
,但我如何转换DataBuffer
为字符串,然后仍然调用该super.decode()
方法?
ExchangeStrategies.builder().codecs((configurer) -> {
configurer.defaultCodecs().jackson2JsonDecoder(new Jaxb2XmlDecoder() {
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
//TODO how to log the response as string content?
return super.decode(inputStream, elementType, mimeType, hints);
}
}));
我成功如下,但我不知道这是否是正确的解决方案?尤其是在里面返回一个空集合flatMapInterable()
感觉不对,但我没有找到另一种方法让它工作。
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
return DataBufferUtils.join(inputStream)
.flatMapIterable(buffer -> {
try {
LOGGER.info(StandardCharsets.UTF_8.decode(buffer.asByteBuffer()).toString());
return Collections.emptyList();
} finally {
DataBufferUtils.release(buffer);
}
})
.map(arg -> super.decode(inputStream, elementType, mimeType, hints));
}
问题:map()
由于我已经阅读了DataBuffer
. 我怎么能读好几遍?
解决方案
到目前为止,我想出了以下解决方案。它有效,但我仍然愿意改进,因为我什至不知道我在这里是否正确地这样做。
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
return DataBufferUtils.join(inputStream)
.doOnNext(buf -> LOGGER.info(StandardCharsets.UTF_8.decode(buf.asByteBuffer()).toString()))
.flatMapMany(buf -> super.decode(Mono.fromSupplier(() -> buf), elementType, mimeType, hints));
}
推荐阅读
- python - 如何修复代码中的打印错误
- mongodb - 如何在没有 Portworx 的 kubernetes 集群中运行 HA MongoDB?
- c# - 在采用 ASP.NET Identity 和自定义实体模型之间进行选择?
- java - Android上的Sqlite DB列顺序问题
- database - 规范化表-DynamoDB
- php - 成功添加到购物车后在产品列表中添加类
- mysql - 从标有 id 和 customId 的行集合中查找最小未使用值
- xml - Powershell 从 XML 中选择最大日期
- sbt-native-packager - sbt-native-packager:将 systemd 服务文件设置为非配置
- c# - CustomVision:操作返回无效状态代码:“未找到”