MargrathX
MargrathX

Reputation: 43

Getting String body from Spring serverrequest

I am trying to get simple string from request body but keep getting errors

Handler:

@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);



    }
}

Router:

@Configuration
public class GreetingRouter {

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

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


    }
}

Request works i can see the contenType (plainTexT) and i get the response in postman but no way i cant get to request body. The most common error i get is MonoOnErrorResume. How do i convert the body from request into String?

Upvotes: 4

Views: 12053

Answers (2)

Dan_Maff
Dan_Maff

Reputation: 331

You will have to block to get to the actual body string:

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

toString() will just give you the string representation of your Mono object.

Here is what block does: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#block--

Update:

I wasn't aware that blocking on the http thread is not possible (anymore?). Here is an adapted version of your hello controller method that prints "Hello yourInput" on the console and also returns that string in the response.

        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);
        }

Upvotes: 4

isalgueiro
isalgueiro

Reputation: 2033

Can you use @RequestBody annotation?

    public Mono<ServerResponse> hello(@RequestBody String body, ServerRequest request) {
        String contentType = request.headers().contentType().get().toString();
        return ServerResponse.ok().body(Mono.just("test"), String.class);
    }

Upvotes: 0

Related Questions