Как получить данные формы POST с помощью обработчиков VERTX?

Я могу получить данные формы с помощью обработчика буфера, но это функция void, и я не могу вернуть значения данных формы. Имейте около 4-7 форм, я не хочу в конечном итоге писать один и тот же обработчик снова и снова, потому что функция по умолчанию недействительна.

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>

Ява:

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);
                }
            }
        });
    }
}

person iCodeLikeImDrunk    schedule 17.01.2013    source источник


Ответы (4)


В настоящее время BodyHandler предоставляется vertx, с его помощью isExpectMultipart будет установлено значение true, и вы сможете читать атрибуты формы как

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

просто добавьте эту строку перед вашим фактическим обработчиком:

router.route().handler(BodyHandler.create());
person Parantap Sharma    schedule 18.10.2016
comment
Для версий vert.x 3+ этот ответ следует принять. - person Arayan Singh; 03.12.2019

Для java это сработало отлично:

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

то, что я сделал в конце, в основном это:

сделать вызов ajax с помощью сообщения, данные из формы должны быть сериализованы.

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

в бэкенде vertx получает эти данные в качестве буфера. остальное - разобрать буфер, разделив его на "&" и "=".

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]));
        }
    }
}

надеюсь, это поможет другим!

person iCodeLikeImDrunk    schedule 30.01.2013
comment
Яо Цзян, я тоже пытаюсь сделать что-то подобное. У меня есть пара вопросов: 1) как ты прицепил javascript к html? вы просто вставили его в верхний или нижний колонтитул? 2) код, который вы показываете в ответе, является объектом буфера из объекта HttpServerRequest? Откуда это? - person Eric; 15.06.2013
comment
1. что вы подразумеваете под крючком? я разделяю js и html, просто устанавливаю источник js в голове, затем настраиваю функции для элементов 2. буфер из vertx, --> request.bodyHandler(new Handler‹Buffer›() { @Override public void handle(Buffer buffer) { --› обычно это то, что я вижу в примерах, поэтому я просто следовал этому коду в java: - person iCodeLikeImDrunk; 16.06.2013
comment
1). это то, что я имел в виду под крюком, так что спасибо. Я так и подозревал, но хотел убедиться. 2) вижу. Вы случайно не используете мод vertx WebServer? - person Eric; 16.06.2013
comment
не уверен, что такое мод WebServer. Я просто следую тому, что показывают мне примеры вершин. - person iCodeLikeImDrunk; 16.06.2013
comment
а, тогда нет. я просто использую vanilla vertx. - person iCodeLikeImDrunk; 16.06.2013

Это можно сделать с помощью formAttributes в http-запросе. Вот пример в скале

  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

person Kevin Bayes    schedule 10.08.2014