我想要 spring-boot-starter-webflux 是 post connection get requestBody

i want spring-boot-starter-webflux is post connection get requestBody

我想我会疯狂的:(

因为ServerRequest,用了一天。

  1. WebClient(Chrome浏览器)ajaxpost类型。
  2. WebServer(SpringBoot Webflux) 使用Handler和Router
  3. WebSecurity 使用 spring-boot-security.

我的问题是这样的。

Chrome浏览器开发工具

浏览器使用developTool,Network tap是header check。
FormData为输入数据成功。

但是!!!

java 日志检查

我不知道!是什么原因。所以我要疯了。

我介绍来源。

JAVASCRIPT AJAX

$(document).ready(function () {
    var data = {"name": "jskang"};
    var strData = JSON.stringify(data);
    var formData = new FormData();
    formData.append("name", "jskang123");

    $.ajax({
        url: "/statistics/systemEnvironment/function2",
        type: "post",
        data: strData,
        contentType: "application/json",
        success: function (data) {
            console.log(data);
        }
    });
});

服务器 Webflux 路由器

@Configuration
@EnableWebFlux
public class RouterConfig implements ApplicationContextAware, WebFluxConfigurer {

    private ApplicationContext context;

    @Bean /* menu setting */
    public RouterFunction<ServerResponse> preSystemEnvironmentRoutes(SystemEnvironmentHandler handler) {
        return route()
            .GET("/statistics/systemEnvironment/function1/{name}", accept(MediaType.APPLICATION_JSON), handler::function1)
            .POST("/statistics/systemEnvironment/function2", accept(MediaType.APPLICATION_JSON), handler::function2)
            .build();
    }

    //////* Thymeleaf webflux setting start *//////
    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }

    @Bean
    public ITemplateResolver thymeleafTemplateResolver() {
        final SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(this.context);
        resolver.setPrefix("classpath:templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCacheable(false);
        resolver.setCheckExistence(false);
        return resolver;

    }

    @Bean
    public ISpringWebFluxTemplateEngine thymeleafTemplateEngine() {
        SpringWebFluxTemplateEngine templateEngine = new SpringWebFluxTemplateEngine();
        templateEngine.setTemplateResolver(thymeleafTemplateResolver());
        return templateEngine;
    }

    @Bean
    public ThymeleafReactiveViewResolver thymeleafReactiveViewResolver() {
        ThymeleafReactiveViewResolver viewResolver = new ThymeleafReactiveViewResolver();
        viewResolver.setTemplateEngine(thymeleafTemplateEngine());
        return viewResolver;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafReactiveViewResolver viewResolver = new ThymeleafReactiveViewResolver();
        viewResolver.setTemplateEngine(thymeleafTemplateEngine());
        registry.viewResolver(thymeleafReactiveViewResolver());
    }
    //////* Thymeleaf webflux setting end *//////
}
}

服务器 Webflux 处理程序

@Component
public class SystemEnvironmentHandler {

    /**
     * The constant LOG.
     */
    private static final Logger LOG = getLogger(SystemEnvironmentHandler.class);

    public Mono<ServerResponse> function1(ServerRequest request) {
        LOG.info("SystemEnvironmentHandler function1 run");
        String variable = request.pathVariable("name");

        Mono<String> response = Mono.just(variable);
        return ServerResponse.ok().body(response, String.class);
    }

    public Mono<ServerResponse> function2(ServerRequest request) {
        LOG.info("SystemEnvironmentHandler function1 run");

        System.out.println("\n========= request check ==========");
        System.out.println(request.attributes().get("name"));
        System.out.println(request.formData().toProcessor());
        System.out.println(request.queryParams());
        System.out.println(request);

        System.out.println("\n========= mono1 check ==========");
        Mono<Name> mono1 = request.bodyToMono(new Name().getClass());
        System.out.println(mono1);

        System.out.println("\n========= mono2 check ==========");
        Mono<Name> mono2 = request.bodyToMono(Name.class);
        System.out.println(mono2);

        System.out.println("\n========= mono3 check ==========");
        Mono<MultiValueMap<String, String>> mono3 = request.body(BodyExtractors.toFormData());
        System.out.println(mono3);
        System.out.println(mono3.toProcessor().peek());

        System.out.println("\n========= formdata check ==========");
        MultiValueMap formData = request.exchange().getFormData().toProcessor().peek();
        System.out.println(formData);

        Mono<String> response = Mono.just(new String("SystemEnvironmentHandler - function2"));
        return ServerResponse.ok().body(response, String.class);
    }

    public class Name{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

你打印的是Monos,而不是Monos里面的内容。尝试打印内容而不是 Monos。对于测试,您也可以这样做。

return serverRequest
        .bodyToMono(Name.class)
        .map(name-> {
          System.out.println(name);
          return name;
        })
        .then(ServerResponse
            .ok()
            .body(response, String.class));

P.S。我不能 post 只是评论。还没有限制。