Как читать параметры формы с помощью helidon-se

#java #reactive #helidon #form-parameter

Вопрос:

Как правильно читать параметры формы в helidon-se.

Я безуспешно пытался выполнить следующее.

  1. Добавьте DefaultMediaSupport.formParamReader() на веб-сервер:
 WebServer.builder()
 .addReader(...) // added here
 .build()
 

Затем чтение request::content с

 request.content()
  .as(FormParams.class)
  .thenAccept(...) // never called
 
  1. Считывать непосредственно из запроса::content:
 DefaultMediaSupport.formParamReader()
  .unmarshall(..., FormParams.class)
  .thenAccept(...) // never called
 

В обоих случаях время ожидания клиента (браузера / httpie) истекает, 30s и запрос не обрабатывается.

Итак, каков правильный способ чтения параметров формы из тела запроса в helidon-se.

Спасибо.

Комментарии:

1. Может быть, этот пример помогает? github.com/oracle/helidon/tree/2.3.4/examples/media/multipart

Ответ №1:

Средство чтения для FormParams доступно из коробки, вам не нужно его явно регистрировать (если вы не отключили средства чтения по умолчанию). Он поддерживает только два типа контента:

  • application/x-www-form-urlencoded
  • text/plain

Вы можете использовать его следующим образом:

 req.content().as(FormParams.class).thenAccept(fp -> {
    fp.first("foo")
      .ifPresentOrElse((greeting) -> res.send(greeting),
              () -> res.status(400).send());
});
 

Вы можете проверить это с помощью curl:

 curl -X POST -d 'foo=bar' http://localhost:8080/abc
 

В HTML форма будет выглядеть следующим образом:

 <form action="/abc" method="post" enctype="application/x-www-form-urlencoded">
    <input type="text" name="foo" />
    <input type="submit" value="Submit!" name="submit">
</form>
 

Helidon также поддерживает multipart/form-data :

Добавьте следующую зависимость в свой pom.xml :

 <dependency>
    <groupId>io.helidon.media</groupId>
    <artifactId>helidon-media-multipart</artifactId>
</dependency>
 

Настройте поддержку мультимедиа в WebServer конструкторе:

 WebServer.builder(createRouting())
         .addMediaSupport(MultiPartSupport.create())
 

Затем используйте его следующим образом:

 req.content().as(ReadableMultiPart.class).thenAccept(multiPart -> {
    multiPart.field("foo")
             .ifPresentOrElse((part) -> res.send(part.as(String.class)),
                     () -> res.status(400).send());
});
 

Вы можете протестировать его с помощью curl следующим образом:

 curl -X POST -F 'foo=bar' http://localhost:8080/abc
 

В HTML форма будет выглядеть следующим образом:

 <form action="/abc" method="post" enctype="multipart/form-data">
    <input type="text" name="foo" />
    <input type="submit" value="Submit!" name="submit">
</form>