Я реализую функцию обработчика с помощью Spring Web Flux и хочу извлечь значения x-www-form-urlencoded
POST-Body.
public Mono<ServerResponse> handle(ServerRequest incomingHttpRequest) {
Mono<MultiValueMap<String, String>> formData = incomingHttpRequest.body(BodyExtractors.toFormData());
return formData
.doOnEach(signal -> {LOG.info("EACH: " + signal.getType());})
.doOnSubscribe(x -> {LOG.info("SUBSCRIBED");})
.doOnNext(next -> {LOG.info("NEXT: " + next);})
.doOnError(x -> {LOG.info("ERROR: " + x.getMessage());})
.doOnSuccess(x -> {LOG.info("SUCCESS: " + x);})
.flatMap(multiValueMap -> ServerResponse
.badRequest()
.body(BodyInserters.fromObject(
"searchTerm: " + multiValueMap.getFirst("searchTerm")
))
);
}
Обработчик добавляется в маршрутизатор как:
return RouterFunctions.route(RequestPredicates.POST("/mysearch"), searchHandler::handle);
Отправка POST с Body searchTerm = что-то & lang = de с помощью Postman дает мне следующий результат:
o.s.w.s.adapter.HttpWebHandlerAdapter : [f405c02b] HTTP POST "/mysearch"
o.s.http.codec.FormHttpMessageReader : [f405c02b] Read form fields [searchTerm, lang] (content masked)
o.s.w.r.f.s.s.RouterFunctionMapping : [f405c02b] Mapped to de.myproject...
de.myproject.MyHandler : SUBSCRIBED
de.myproject.MyHandler : EACH: onComplete
de.myproject.MyHandler : SUCCESS: null
o.s.w.s.adapter.HttpWebHandlerAdapter : [f405c02b] Completed 200 OK
Я ожидаю получить BAD_REQUEST, содержащий searchTerm. Но вместо этого я получаю 200.
Мне кажется, что получившийся Mono подписан и затем успешно завершается. Но formData
никогда не получает значение и, следовательно, никогда не входит в flatMap(...)
Что я делаю неправильно, отображая Mono<MultiValueMap<String, String>>
в Mono<ServerResponse>
?