#java #reactive #helidon #form-parameter
Вопрос:
Как правильно читать параметры формы в helidon-se.
Я безуспешно пытался выполнить следующее.
- Добавьте DefaultMediaSupport.formParamReader() на веб-сервер:
WebServer.builder()
.addReader(...) // added here
.build()
Затем чтение request::content
с
request.content()
.as(FormParams.class)
.thenAccept(...) // never called
- Считывать непосредственно из запроса::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>