如何使用Spark Java从表单获取数据?

17

我对这些东西还很陌生,希望你们能帮助我理解它的工作原理。 我有一个带有字段的表单。如何从客户端获取数据?查找了一些信息,但没有找到。

<form action="Dispatcher" method="post">
    <fieldset>
        <p>Name</p>
        <input type="text" name="userName" required="true">

        <p>Email</p>
        <input type="text" name="userEmail" required="true">
        <input type="submit" value="submit">
    </fieldset>
</form>

这些答案中有没有对你有用的? - Hack-R
5个回答

20

我遇到了同样的问题。我使用了queryParams来解决它:

request.queryParams("userName")

13
请注意,您必须确保在调用request.body()之前不会被调用(例如用于日志记录),否则它将消耗请求体,表单参数将无法解析。该Javadoc对此问题的说明相当缺乏。 - bric3
1
这很奇怪。我本来期望 request.params("userName") 返回值,但实际上 request.queryParams("userName") 给出了相同的值。我原以为 queryParams 应该返回查询字符串。这是 Java Spark 的正常行为吗? - Raf
2
@Raf 这是Java Spark的正常行为吗?你说对了:这是Java Spark的一种奇怪行为。 - Stephan
@Stephan谢谢,你的回答帮了我大忙。我想测试微服务,我做的方式和大多数在线示例不同,你可以看一下这个问题http://stackoverflow.com/questions/37715875/testing-java-spark-microservices-app-that-implements-sparkapplication-interface,期待得到你的反馈。 - Raf
正如@Raf之前所提到的,我本来期望request.params("userName")也能够起作用。但实际上,request.queryParams("userName")已经对我起了作用,而我不明白为什么。如果有人能够解释,请添加说明。另外,我正在使用Postman测试这个表单提交,并且只有“x-www-form-urlencoded”请求可以工作。在Postman上设置为“form-data”的POST请求无法工作。 - AniJ
1
queryParams 委托给底层的 HTTP 基础设施的 Request::getParameter(请参见 https://github.com/perwendel/spark/blob/master/src/main/java/spark/Request.java#L292)。该方法的文档解释了“将请求参数的值作为字符串返回,如果参数不存在,则返回 null。请求参数是随请求发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发布的表单数据中。”https://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html#getParameter-java.lang.String- - Jeremy Wiebe

5

仅供记录,我曾遇到类似的问题,以下是我的解决方法。

由于这是一个多部分请求,您需要指定

MultipartConfigElement multipartConfigElement = new MultipartConfigElement(path);

req.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement);

你可以在这里找到详细信息:SparkJava:上传文件在Spark java框架中无法工作 一旦正确完成,你应该能够像Stephan提到的那样使用查询参数访问数据

3
我认为您需要使用request.params("userName"),它将给您提供提交的参数列表,其中包含名称userName

奇怪的命名规则。应该让它更明显:getPostParam - TheRealChx101

1

正如Java文档所述,

如果参数数据是通过请求体发送的,比如HTTP POST请求,那么直接通过getInputStream()或getReader()读取请求体可能会干扰该方法的执行。

因此,在调用request.body()(例如进行日志记录)后,request.queryParams("userName")将无法工作。我编写了一个实用函数来获取参数。

public static String getParameter(String body, String param) {
    HashMap<String, String> params = new HashMap();
    for (String s : body.split("&")) {
        String[] kv = s.split("=");
        params.put(kv[0], kv[1]);
    }
    String encoded = params.get(param);
    return URLDecoder.decode(encoded, StandardCharsets.UTF_8);
}

-3
我认为你最好使用像AngularJS或jQuery这样的js框架,在将表单数据发送到服务器之前将其转换为json格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接