Spring WebFlux既支持像Tomcat,Jetty这样的的传统容器(前提是支持Servlet 3.1 Non-Blocking IO API),又支持像Netty,Undertow那样的异步容器。不管是何种容器,Spring WebFlux都会将其输入输出流适配成Flux<DataBuffer>格式,以便进行统一处理。
在使用SpringCloud-gateway时,在各个filter里,都有ServerWebExchange对象,exchange里面携带着用户的request,request里带着用户请求的数据。
如果是Get请求传的参数,我们可以直接通过下图红框这样的方式获取参数的值,但是post请求的值就取不到了。
post的值都封装在了 Flux<DataBuffer> 对象中,那么我们怎么将它转为可读的String呢?
Flux<DataBuffer> body = exchange.getRequest().getBody();
body.subscribe(buffer -> {
byte[] bytes = new byte[buffer.readableByteCount()];
buffer.read(bytes);
DataBufferUtils.release(buffer);
try {
String bodyString = new String(bytes, "utf-8");
System.out.println(bodyString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
});
这里面就是一种方式,post传的参数如下
上面代码处理后的bodyString如下:
还有一些其他的方式,如
AtomicReference<String> bodyRef = new AtomicReference<>();
body.subscribe(buffer -> {
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
DataBufferUtils.release(buffer);
bodyRef.set(charBuffer.toString());
});
//获取request body
String bodyStr = bodyRef.get();
System.out.println(bodyStr);
大家可以去看一下DataBuffer的方法,里面有多个方法可以读取里面的值。