Получение тела String из Spring serverquest - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь получить простую строку из тела запроса, но продолжаю получать ошибки

Обработчик:

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


    }
}

Запрос работает, я вижуcontenType (plainTexT) и я получаю ответ в почтальоне, но никак не могу получить тело запроса.Самая распространенная ошибка, которую я получаю, это MonoOnErrorResume.Как преобразовать тело из запроса в строку?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вам придется заблокировать, чтобы получить текущую строку тела:

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

toString() просто даст вам строковое представление вашего Mono объекта.

Вот что делает блок: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#block--

Обновление:

Я не знал, что блокировка в потоке http невозможна (больше?).Вот адаптированная версия вашего hello метода контроллера, который печатает «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);
        }
0 голосов
/ 05 февраля 2019

Можете ли вы использовать @RequestBody аннотацию?

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