gpt4 book ai didi

java - 如何最好地从 Spring WebClient 的 ClientResponse 中获取字节数组?

转载 作者:IT老高 更新时间:2023-10-28 13:45:23 28 4
gpt4 key购买 nike

我正在使用响应式编程的代码库中尝试来自 Spring 5 (5.0.0.RC2) 的新 WebClient,并且我已成功将 JSON 响应从端点映射到我的应用程序中的 DTO,效果非常好:

WebClient client = WebClient.create(baseURI);
Mono<DTO> dto = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(DTO.class));

但是,现在我正在尝试从使用 Protocol Buffer 的端点(二进制数据用作 application/octet-stream)的响应正文,所以我想获取原始字节来自响应,然后我将自己映射到一个对象。

我使用来自 Google Guava 的 Bytes 让它像这样工作:

Mono<byte[]> bytes = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchange()
.flatMapMany(response -> response.body(BodyExtractors.toDataBuffers()))
.map(dataBuffer -> {
ByteBuffer byteBuffer = dataBuffer.asByteBuffer();
byte[] byteArray = new byte[byteBuffer.remaining()];
byteBuffer.get(byteArray, 0, bytes.length);
return byteArray;
})
.reduce(Bytes::concat)

这可行,但有没有更简单、更优雅的方式来获取这些字节?

最佳答案

ClientResponse.bodyToMono()最后使用了一些声称支持指定类的org.springframework.core.codec.Decoder

所以我们应该检查 Decoder 的类层次结构,特别是 decodeToMono() 方法的实现位置和方式。

有一个 StringDecoder 支持解码为 String,一堆 jackson 相关的解码器(在你的 DTO 示例中使用),还有一个ResourceDecoder 特别感兴趣。

ResourceDecoder 支持 org.springframework.core.io.InputStreamResourceorg.springframework.core.io.ByteArrayResourceByteArrayResource 本质上是 byte[] 的包装器,因此以下代码将提供对响应正文的访问作为字节数组:

Mono<byte[]> mono = client.get()
...
.exchange()
.flatMap(response -> response.bodyToMono(ByteArrayResource.class))
.map(ByteArrayResource::getByteArray);

关于java - 如何最好地从 Spring WebClient 的 ClientResponse 中获取字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44821187/

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