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[]
をメモリにロードします。
最近の安定した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セクションでは直接参照していません。