相关疑难解决方法(0)

如何从Spring WebClient的ClientResponse中获取最佳字节数组?

我正在尝试WebClient使用反应式编程的代码库中的Spring 5(5.0.0.RC2)中的新内容,并且我已成功将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));
Run Code Online (Sandbox Code Playgroud)

但是,现在我正在尝试使用协议缓冲区(二进制数据作为application/octet-stream)的端点的响应体,所以我想从响应中获取原始字节,然后我将自己映射到一个对象.

Bytes从Google Guava 那里得到了这样的工作方式:

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)
Run Code Online (Sandbox Code Playgroud)

这有效,但是有更简单,更优雅的方式来获取这些字节吗?

java spring binary-data protocol-buffers reactive-programming

13
推荐指数
1
解决办法
4607
查看次数

Spring WebClient:如何将大byte []流式传输到文件?

看起来Spring RestTemplate不能将响应直接流式传输到文件而不将其全部缓存在内存中。使用较新的Spring 5实现此目标的合适方法是WebClient什么?

WebClient client = WebClient.create("https://example.com");
client.get().uri(".../{name}", name).accept(MediaType.APPLICATION_OCTET_STREAM)
                    ....?
Run Code Online (Sandbox Code Playgroud)

我看到人们已经找到了解决此问题的一些变通方法/技巧RestTemplate,但是我对使用正确的方法更感兴趣WebClient

有许多RestTemplate用于下载二进制数据的示例,但是几乎所有示例都将其加载byte[]到内存中。

java spring project-reactor spring-webflux spring-webclient

8
推荐指数
1
解决办法
1386
查看次数