javawebsocketvert.xvert.x-webclient

Vert.x: How to send a post request?


My first Vertx Web app :

I expect To get the index.html at localhost.8080/Test then find a way to retrieve the data, but the page doesn't show

I have a RequestResponseExample class:

public class RequestResponseExample extends AbstractVerticle {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();

        Router router = Router.router(vertx);

        router.post("/Test").handler(rc -> rc.response().sendFile("index.html"));

        vertx.createHttpServer()
            .requestHandler(router)
            .listen(8080);
    }

}

And My Html Code index.html

<html>
<head>
  <meta charSet="UTF-8">
  <title>OTP Authenticator Verification Example Page</title>
</head>
<body>
<form action="/" method="post" encType="multipart/form-data">
  <div>
    <label>Code:</label>
    <input type="text" name="code"/><br/>
  </div>
  <div>
    <input type="submit" value="Submit"/>
  </div>
</form>
</body>
</html>


Solution

  • Solution

    Change router.post( to router.get(.

    Description

    Currently, you are configuring the Router to only handle HTTP POST request. That means, it is configured to respond to such an HTTP request:

    POST /Test
    

    But when you try to open localhost.8080/Test in your browser, it will send such a request to your server:

    GET /Test
    

    This is why you have to tell the router to handle GET and not POST requests.

    Additional information: GET and POST are so called HTTP request methods. If you want to learn more about that, I recommend you to read the following article: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

    About Verticles

    In your code, you can remove extends AbstractVerticle and it will work the same way. If you want your code to get executed in the context of a verticle you have to create an instance of your class and then you have to deploy it:

    import io.vertx.core.AbstractVerticle;
    import io.vertx.core.Vertx;
    import io.vertx.ext.web.Router;
    import io.vertx.ext.web.handler.BodyHandler;
    
    public class RequestResponseExample extends AbstractVerticle {
    
        public static void main(String[] args) {
            Vertx vertx = Vertx.vertx();
    
            vertx.deployVerticle(new RequestResponseExample());
        }
    
        @Override
        public void start(){
            Router router = Router.router(vertx);
    
            router.get("/Test").handler(rc -> rc.response().sendFile("index.html"));
            router.post().handler(BodyHandler.create());
            router.post("/").handler(rc -> System.out.println(rc.request().formAttributes().get("code")));
    
            vertx.createHttpServer()
                .requestHandler(router)
                .listen(8080);
        }
    
    }
    

    Since I see a bit of confusion on your side, you may want to also read the following article about Verticles: https://vertx.io/docs/vertx-core/java/#_verticles