java - 从 Spring 服务器请求获取字符串主体

标签 java spring reactive-programming

我试图从请求正文中获取简单的字符串,但不断收到错误

处理程序:

@RestController

public class GreetingHandler {


    public Mono<ServerResponse> hello(ServerRequest request) {

        String contentType = request.headers().contentType().get().toString();

        String body = request.bodyToMono(String.class).toString();

        return ServerResponse.ok().body(Mono.just("test"), String.class);



    }
}

路由器:

@Configuration
public class GreetingRouter {

    @Bean
    public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {

       return RouterFunctions
                .route(RequestPredicates.POST("/hello"),greetingHandler::hello);


    }
}

请求有效,我可以看到内容类型(plainTexT),并且我在 postman 中得到响应,但我无法获取请求正文。我遇到的最常见错误是 MonoOnErrorResume。如何将请求正文转换为字符串?

最佳答案

您必须阻止才能到达实际的正文字符串:

String body = request.bodyToMono(String.class).block();

toString() 只会为您提供 Mono 对象的字符串表示形式。

这是 block 的作用: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#block--

更新:

我不知道在 http 线程上阻塞是不可能的(现在了吗?)。 这是 hello Controller 方法的改编版本,它在控制台上打印“Hello yourInput”,并在响应中返回该字符串。

        public Mono<ServerResponse> hello(ServerRequest request) {
            Mono<String> requestMono = request.bodyToMono(String.class);
            Mono<String> mapped = requestMono.map(name -> "Hello " + name)
                .doOnSuccess(s -> System.out.println(s));
            return ServerResponse.ok().body(mapped, String.class);
        }

关于java - 从 Spring 服务器请求获取字符串主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531407/

相关文章:

java - 我的枚举正确吗?

java - 仅在订单状态更改时执行该功能

java - 在 Java 中使用扫描器

spring - 通过 spring LDAP 进行身份验证,并在数据库中进行额外的安全检查

spring - 使用 Spring Webflux 恢复文件下载以及 Spring 中的静态文件服务

swift - RxSwift 兼顾本地数据库和远程网络?

java - 干净的数字除法

java - Hibernate LazyInitializationException - 如何解决此问题?

java - 在 Spring boot 中使用 CRaSH 命令获取用户名

java - RxJava : merge() changes the order of the emitted items?