WebFlux 框架对 request 的 InputStream 和 response 的 OutputStream 的使用

Posted catoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebFlux 框架对 request 的 InputStream 和 response 的 OutputStream 的使用相关的知识,希望对你有一定的参考价值。

说到 WebFlux 就要提到和对比 Servlet,这样也是为了保留和尽量靠近传统代码的实现逻辑,所以最常用的就是对请求的输入流和响应的输出流处理。

在 Servlet 中获取输入流和输出流

HttpServletRequest request;
HttpServletResponse response;

InputStream inputStream = request.getInputStream();
OutputStream outputStream = response.getOutputStream();

在 WebFlux 中获取输入流和输出流

1、OutputStream 输出流的应用代码片段示例

public Mono<Void> handle(ServerHttpResponse response) 	
	DataBuffer dataBuffer = response.bufferFactory().allocateBuffer();
	// 获得 OutputStream 的引用
	OutputStream outputStream = dataBuffer.asOutputStream();
	// 操作 outputStream 往里面写入数据
	......
	......
	......
	// 将 dataBuffer 输出到 response
	return response.writeWith(Mono.just(dataBuffer));

2、InputStream 输入流的应用代码片段示例

public Mono<Void> handle(ServerHttpRequest request) 	
    return request.getBody().collect(ServerHttpConnection.InputStreamCollector::new,
                            (t, dataBuffer) -> t.collectInputStream(dataBuffer.asInputStream()))
           .flatMap(inputStreamCollector -> 
               // 将输入流多个dataBuffer合并为一个InputStream后使用
               InputStream requestInputStream = inputStreamCollector.getInputStream();
			   // 操作 inputStream 读取数据并处理
			   ......
			   ......
			   ......
			   // 这里返回 empty 只是示例,实际使用根据自己需求返回对应数据
               return Mono.empty();
           );

其中合并多个 InputStream 使用 Java 的 SequenceInputStream 来处理,以下为内部类代码

static class InputStreamCollector 

    private InputStream is;

    public void collectInputStream(InputStream is) 
        if (this.is == null) this.is = is;
        this.is = new SequenceInputStream(this.is, is);
    

    public InputStream getInputStream() 
        return this.is;
    

以上关于输入和输出流的代码可以应用于文件的上传和下载。


(END)

以上是关于WebFlux 框架对 request 的 InputStream 和 response 的 OutputStream 的使用的主要内容,如果未能解决你的问题,请参考以下文章

Spring 5 之 WebFlux 开发反应式 Web 应用

技术使用 Spring 5 的 WebFlux 开发反应式 Web 应用

spring赌上未来的一击:WebFlux性能实测

Kotlin结合Spring WebFlux实现响应式编程

Srping 响应式框架 WebFlux 的性能小测试_WebClient连接池

Spring WebFlux