WebFlux注解下读取ServerHttpRequest 请求报文流数据方法

≡放荡痞女 提交于 2019-12-15 21:54:45

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

在WebFlux的注解模式下没有找到有用的直接从 ServerHttpRequest 读取请求报文流的方法,下面是我自己摸索出来的方法,主要借鉴了Spring Security的源码, 重点是需要注入 Webflux的解码器

 @Autowired
 private ServerCodecConfigurer serverCodecConfigurer = null;

然后在进行如下处理:

@PostMapping("/connect")
    public Mono<Void> connect(final ServerHttpRequest request, final ServerHttpResponse response) {
        log.debug("connect...");
        final ResolvableType reqDataType = ResolvableType.forClass(byte[].class);
        return response.writeWith(serverCodecConfigurer.getReaders().stream()
                .filter(reader -> reader.canRead(reqDataType, MediaType.ALL))
                .findFirst()
                .orElseThrow(() -> new IllegalStateException("No Data"))
                .readMono(reqDataType, request, Collections.emptyMap())
                .cast(byte[].class)
                .map(bytes -> {
                    try {
                        final String reqBody = new String(bytes, StandardCharsets.UTF_8);
                        log.info("reqBody => \n {}", reqBody);
			///TODO:  实现自己的业务

                        final NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(new UnpooledByteBufAllocator(false));
                        return nettyDataBufferFactory.wrap("ok".getBytes(StandardCharsets.UTF_8));
                    } catch (Throwable ex) {
                        log.warn("connect-exp: {}", ex.getMessage());
                        return null;
                    }
                })
        );
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!