【问题标题】:How to get POST form data using VERTX handlers?如何使用 VERTX 处理程序获取 POST 表单数据?
【发布时间】:2013-01-17 23:57:41
【问题描述】:

我可以使用缓冲区处理程序获取表单数据,但它是一个 void 函数,我无法返回表单数据值。总共有大约 4-7 个表单,我不想一遍又一遍地编写相同的处理程序,因为默认函数是 void。

html:

<!DOCTYPE html>
<html>    
<head><title>Login Page</title></head>
<body>
    <a href="/activateUserPage">activate user</a>
    <br/>
    <a href="/login">log in</a>
    <br/>

    <form id='login' action='/login' method='post'>
        <fieldset >
            <legend>Login</legend>
            <input type='hidden' name='submitted' id='submitted' value='1'/>

            <label for='username' >UserName: </label>
            <input type='text' name='username' id='username'  maxlength="50"/>

            <label for='password' >Password: </label>
            <input type='password' name='password' id='password' maxlength="50"/>

            <input type='submit' name='Submit' value='Submit' />
        </fieldset>
    </form>         
</body>    
</html>

java:

import org.jboss.netty.handler.codec.http.QueryStringDecoder;
import org.vertx.java.core.Handler;
import org.vertx.java.core.Vertx;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.RouteMatcher;
import org.vertx.java.deploy.Verticle;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by IntelliJ IDEA.
 * User: yao
 * Date: 1/17/13
 * Time: 2:22 PM
 */

public class Main extends Verticle
{
    @Override
    public void start() throws Exception
    {
        System.out.println("starting the vertx stuff");
        final String host = "localhost";
        final String port = "8181";

        Vertx vertx = Vertx.newVertx();
        HttpServer httpServer = vertx.createHttpServer();

        ...

        httpServer.requestHandler(new Handler<HttpServerRequest>()
        {
            public void handle(HttpServerRequest req)
            {
                String path = req.path;

                /* start mapping of page urls*/
                // redirect user to the login page
                if (path.equals("/"))
                {
                    req.response.sendFile(dir + "html/loginPage.html");
                }
                ...

                /* end mapping of page urls*/

                /* start mapping of form urls */
                // login
                else if (path.equals(login))
                {
                    mainLogin();
                    getFormData(req);
                }
                ...

                /* end mapping of form urls */

                /* all other pages */
                else
                {
                    req.response.end("404 - page no exist");
                }
            }
        });

        System.out.println("vertx listening to: " + host + " " + port);
        httpServer.listen(Integer.valueOf(port), host);
    }

    ...

    private void getFormData(final HttpServerRequest req)
    {
        req.bodyHandler(new Handler<Buffer>()
        {
            @Override
            public void handle(Buffer buff)
            {
                String contentType = req.headers().get("Content-Type");
                if ("application/x-www-form-urlencoded".equals(contentType))
                {
                    QueryStringDecoder qsd = new QueryStringDecoder(buff.toString(), false);
                    Map<String, List<String>> params = qsd.getParameters();
                    System.out.println(params);
                }
            }
        });
    }
}

【问题讨论】:

    标签: java vert.x forms http-post


    【解决方案1】:

    现在 BodyHandler 是由 vertx 提供的,使用它时 isExpectMultipart 将被设置为 true 并且您将能够读取表单属性为

    request.getFormAttribute("username");//to read input named username.
    

    只需在您的实际处理程序之前添加这一行:

    router.route().handler(BodyHandler.create());
    

    【讨论】:

    • 对于 vert.x 3+ 版本,这应该被接受。
    【解决方案2】:

    对于 java,这非常有效:

    request.expectMultiPart(true);
        request.endHandler(req->{
          String text = request.formAttributes().get("bigtext"); 
          //got it here
          //do something ...
     });
    

    【讨论】:

      【解决方案3】:

      我最后做的基本上是这样的:

      使用post进行ajax调用,表单中的数据需要序列化。

      $.ajax
      ({
          type: "POST",
          url: "/login",
          data: $('#frm_login').serialize(),
          success: function(data)
      ...
      

      在后端,vertx 接收此数据作为缓冲区。 rest 是通过“&”和“=”分割来解析缓冲区。

      Map<String, String> params = new HashMap<String, String>();
      String[] paramSplits = buffer.toString().split("&");
      String[] valueSplits;
      
      if (paramSplits.length > 1)
      {
          for (String param : paramSplits)
          {
              valueSplits = param.split("=");
              if (valueSplits.length > 1)
              {
                  // add this check to handle empty phone number fields
                  params.put(decode(valueSplits[0]), decode(valueSplits[1]));
              }
          }
      }
      

      希望这对其他人有所帮助!

      【讨论】:

      • 姚江,我也在尝试做类似的事情。我有几个问题:1)你是如何将 javascript 连接到 html 的?你只是将它嵌入到页眉或页脚中吗? 2)您在答案中显示的代码是来自 HttpServerRequest 对象的缓冲区对象吗?这是哪里来的?
      • 1.你说的钩子是什么意思?我将js和html分开,只需在head中设置js的来源,然后为元素设置函数2.缓冲区来自vertx,--> request.bodyHandler(new Handler() { @Override public void handle(Buffer buffer) { --> 这通常是我在示例中看到的,所以我只是跟着它。代码在 java 中:
      • 1)。这就是我所说的“钩子”,所以谢谢。我也有同样的怀疑,但想确认一下。 2) 我明白了。您是否有机会使用 vertx WebServer mod?
      • 不确定 WebServer mod 是什么。我只是遵循 vertx 示例向我展示的任何内容。
      • 啊,那不行。我只是使用香草 vertx。
      【解决方案4】:

      这可以使用 http 请求上的 formAttributes 来完成。这是scala中的一个例子

        req.expectMultiPart(true) //Will expect a form
        req.endHandler({
      
          req.formAttributes() //This is used to access form attributes
      
          //some code with attributes
      
        })
      

      参考:http://vertx.io/core_manual_java.html#handling-multipart-form-attributes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多