如何正确读取helidon-se中的表单参数
我试着做了以下的事情,但是没有成功。
- 添加DefaultMediaSupport.formParamReader ()到web服务器:
WebServer.builder()
.addReader(...) // added here
.build()
然后用
读取request::content
request.content()
.as(FormParams.class)
.thenAccept(...) // never called
- 直接读取Request::content:
DefaultMediaSupport.formParamReader()
.unmarshall(..., FormParams.class)
.thenAccept(...) // never called
这两种情况下,客户端(浏览器/http)在30s
之后超时,请求不被处理。
那么,在helidon-se中从请求体中读取表单参数的正确方法是什么呢?
谢谢。
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>