web-dev-qa-db-fra.com

Spring WebClient: comment diffuser un octet de grande taille [] dans un fichier?

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.

11
Dave L.

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 .

1
Z4-