作者:hosion0723 | 来源:互联网 | 2023-01-30 20:49
我正在尝试WebClient
使用反应式编程的代码库中的Spring 5(5.0.0.RC2)中的新内容,并且我已成功将JSON响应从端点映射到我的应用程序中的DTO,这非常好用:
WebClient client = WebClient.create(baseURI);
Mono dto = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(DTO.class));
但是,现在我正在尝试使用协议缓冲区(二进制数据作为application/octet-stream
)的端点的响应体,所以我想从响应中获取原始字节,然后我将自己映射到一个对象.
我Bytes
从Google Guava 那里得到了这样的工作方式:
Mono 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)
这有效,但是有更简单,更优雅的方式来获取这些字节吗?
1> Oleg Estekhi..:
ClientResponse.bodyToMono()
最后使用一些org.springframework.core.codec.Decoder
声称支持指定类的.
所以我们应该检查类的层次结构Decoder
,特别是decodeToMono()
方法的实现位置和方式.
有一个StringDecoder
支持解码String
,一堆杰克逊相关的解码器(在您的DTO示例中使用),还有一个ResourceDecoder
特别感兴趣的解码器.
ResourceDecoder
支持org.springframework.core.io.InputStreamResource
和org.springframework.core.io.ByteArrayResource
.ByteArrayResource
本质上是一个包装器byte[]
,因此以下代码将提供对作为字节数组的响应主体的访问:
Mono mOno= client.get()
...
.exchange()
.flatMap(response -> response.bodyToMono(ByteArrayResource.class))
.map(ByteArrayResource::getByteArray);
请注意,这将缓冲响应并将整个字节数组加载到内存中.