web-dev-qa-db-ja.com

Spring WebClient:大きなバイト[]をファイルにストリーミングする方法は?

Spring RestTemplateは、すべてをメモリにバッファリングせずに応答をファイルに直接ストリーミングできないようです。新しいSpring 5 WebClientを使用してこれを実現する適切な方法は何ですか?

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

RestTemplateを使用してこの問題の回避策/ハックを見つけた人がいるようですが、WebClientを使用して適切な方法でそれを行うことに興味があります。

RestTemplateを使用してバイナリデータをダウンロードする例はたくさんありますが、それらのほとんどすべてがbyte[]をメモリにロードします。

11
Dave L.

最近の安定したSpring WebFlux(執筆時点では5.2.4.RELEASE):

_final WebClient client = WebClient.create("https://example.com");
final Flux<DataBuffer> dataBufferFlux = client.get()
        .accept(MediaType.TEXT_HTML)
        .retrieve()
        .bodyToFlux(DataBuffer.class); // the magic happens here

final Path path = FileSystems.getDefault().getPath("target/example.html");
DataBufferUtils
        .write(dataBufferFlux, path, CREATE_NEW)
        .block(); // only block here if the rest of your code is synchronous

_

私にとって自明ではない部分はbodyToFlux(DataBuffer.class)でした。これは現在、Springのドキュメントの ストリーミングに関する一般的なセクション で言及されているため、WebClientセクションでは直接参照していません。

1
Z4-