Il semble que le Spring RestTemplate
ne soit pas en mesure de diffuser une réponse directement dans un fichier sans le mettre en mémoire tampon. Quelle est la solution pour y parvenir en utilisant la nouvelle version Spring 5 WebClient
?
WebClient client = WebClient.create("https://example.com");
client.get().uri(".../{name}", name).accept(MediaType.APPLICATION_OCTET_STREAM)
....?
Je vois que les gens ont trouvé quelques solutions de contournement/hacks à ce problème avec RestTemplate
, mais je suis plus intéressé à le faire correctement avec le WebClient
.
Il existe de nombreux exemples d'utilisation de RestTemplate
pour télécharger des données binaires, mais presque tous chargent le byte[]
en mémoire.
Avec Spring WebFlux stable récent (5.2.4.RELEASE au moment de l'écriture):
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
Pour moi, la partie non évidente était la bodyToFlux(DataBuffer.class)
, comme elle est actuellement mentionnée dans une section générique sur le streaming de la documentation de Spring, il n'y a aucune référence directe à elle dans la section WebClient .