Как отправить URL закодированные данные весной webflux - PullRequest
0 голосов
/ 07 апреля 2020

Я пишу веб-приложение Spring 5, и мое требование - получить форму с кодировкой urlen и в ответ отправить обратно кодированный ответ обратно

Это код функции маршрутизатора

@Configuration
public class AppRoute {

  @Bean
  public RouterFunction<ServerResponse> route(FormHandler formHandler) {

    return RouterFunctions.route()
           // .GET("/form", formHandler::sampleForm)
           // .POST("/form", accept(MediaType.APPLICATION_FORM_URLENCODED), formHandler::displayFormData)
            .POST("/formnew", accept(MediaType.APPLICATION_FORM_URLENCODED).and(contentType(MediaType.APPLICATION_FORM_URLENCODED)), formHandler::newForm)
            .build();
  }
}

и вот мой код обработчика

public Mono<ServerResponse> newForm(ServerRequest request) {
    Mono<MultiValueMap<String, String>> formData = request.formData();
    MultiValueMap<String, String> newFormData = new LinkedMultiValueMap<String, String>();

    formData.subscribe(p -> newFormData.putAll(p));
    newFormData.add("status", "success");

    return ServerResponse.ok().contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .body(fromObject(newFormData));
}

Вот ошибка, которую я получаю

2020-04-07 02: 37: 33.329 DEBUG 38688 --- [ctor-http-nio-3] org.springframework.web.HttpLogging: [07467aa5] Разрешено [UnsupportedMediaTypeException: тип содержимого 'application / x- www-form-urlencoded' не поддерживается для bodyType = org.springframework.util.LinkedMultiValueMap] для HTTP POST / 101 * * * * * * * *

В чем проблема здесь. Я не мог найти способ написать ответ, закодированный в URL. Кто-нибудь может указать, в чем проблема.

1 Ответ

0 голосов
/ 07 апреля 2020

Попробуйте изменить код в функциональном стиле:

public Mono<ServerResponse> newForm(ServerRequest request) {
    Mono<DataBuffer> resultMono = request.formData()
        .map(formData -> new LinkedMultiValueMap(formData))
        .doOnNext(newFormData -> newFormData.add("status", "success"))
        .map(linkedMultiValueMap -> createBody(linkedMultiValueMap));

    return ServerResponse.ok().contentType(MediaType.APPLICATION_FORM_URLENCODED)
        .body(BodyInserters.fromDataBuffers(resultMono));


}

private DataBuffer createBody(MultiValueMap multiValueMap) {
    try {
        DefaultDataBufferFactory factory = new DefaultDataBufferFactory();
        return factory.wrap(ByteBuffer.wrap(objectMapper.writeValueAsString(multiValueMap).getBytes(StandardCharsets.UTF_8)));
    } catch (JsonProcessingException e) {
        throw new IllegalArgumentException("incorrect body");
    }
}
...