Spring WebClient 是 Spring 5 引入的一个用于构建非阻塞的、响应式的 HTTP 客户端的工具。它基于 Reactor 项目,提供了强大的流式处理能力,非常适合处理大型数据传输。
WebClient 支持多种类型的请求和响应处理,包括:
适用于需要处理大量数据传输的场景,如文件下载、大数据处理、实时数据流等。
以下是一个示例代码,展示如何使用 WebClient 将大型 byte[] 流式传输到文件:
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
public class WebClientFileDownload {
public static void main(String[] args) {
String url = "https://example.com/large-file.bin";
Path filePath = Paths.get("downloaded-file.bin");
WebClient webClient = WebClient.create();
Mono<Void> download = webClient.get()
.uri(url)
.exchangeToFlux(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToFlux(DataBuffer.class);
} else {
return Flux.error(new RuntimeException("Failed to download file"));
}
})
.doOnNext(dataBuffer -> {
try (FileOutputStream fos = new FileOutputStream(filePath.toFile());
FileChannel channel = fos.getChannel()) {
channel.write(dataBuffer.asByteBuffer());
} catch (IOException e) {
throw new RuntimeException("Failed to write file", e);
}
})
.doOnError(throwable -> System.err.println("Error during download: " + throwable.getMessage()))
.then();
download.block();
}
}
WebClient.create()
创建一个 WebClient 实例。webClient.get().uri(url).exchangeToFlux()
发起 GET 请求,并将响应转换为 Flux<DataBuffer>
。doOnNext
操作符将每个 DataBuffer
写入文件。这里使用了 FileOutputStream
和 FileChannel
来高效地写入文件。doOnError
操作符处理下载过程中可能出现的错误。通过这种方式,可以高效地将大型 byte[] 流式传输到文件,避免内存溢出等问题。
领取专属 10元无门槛券
手把手带您无忧上云