Я пытаюсь получить простую строку из тела запроса, но продолжаю получать ошибки
Обработчик:
@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. Как преобразовать тело запроса в строку?




Можете ли вы использовать аннотацию @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);
}
После добавления @RequestBody я получаю сообщение об ошибке в Router: «метод route в классе org.springframework.web.reactive.function.server.RouterFunction не может быть применен к заданным типам;»
Вам нужно будет заблокировать, чтобы добраться до фактической строки тела:
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);
}
После добавления блока я получаю сообщение об ошибке "java.lang.IllegalStateException: block()/blockFirst()/blockLast() блокируются, что не поддерживается в потоке Reactor-http-nio-2"
Отлично работает. Спасибо тебе большое.
Что, если мне нужно получить List<String> из их тела. какой тип класса я должен пройти тогда? @Dan_Maff
пожалуйста, включите первые 2 строки в блок кодирования и последние фигурные скобки