0

在 helidon-se 中读取表单参数的正确方法是什么?

我尝试执行以下操作但没有成功。

  1. DefaultMediaSupport.formParamReader()添加到网络服务器:
WebServer.builder()
 .addReader(...) // added here
 .build()

然后阅读request::contentwith

request.content()
  .as(FormParams.class)
  .thenAccept(...) // never called
  1. 直接从Request::content中读取:
DefaultMediaSupport.formParamReader()
  .unmarshall(..., FormParams.class)
  .thenAccept(...) // never called

在这两种情况下,客户端(浏览器/httpie)都超时30s并且请求未被处理。

那么,从 helidon-se 中的请求正文中读取表单参数的正确方法是什么。

谢谢。

4

1 回答 1

2

的阅读器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>
于 2021-10-26T20:46:44.533 回答