这篇文章将介绍如何通过 Vert.x 来开发一个 web 应用。
Q:为什么要使用 Vert.x
A:因为 Vert.x 是一个更纯粹的基于 Reactive 模式的框架,在云平台上可以更充分利用容器的资源,基于 Netty 的二次开发,可以更好的利用 Netty 的一些特性。
关于什么是 Vert.x,请参考这篇文章
快速开始
你可以通过脚手架创建一个基础工程,至少需要包括:
<dependency> <groupId>io.vertx</groupId> <artifactId>vertx-web</artifactId></dependency>
复制代码
扩展
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>
复制代码
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId></dependency><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId></dependency>
复制代码
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId></dependency>
复制代码
代码
这里将会使用Router来代替脚手架里面的原生代码,方便更好的管理代码。
HttpServer server = vertx.createHttpServer(); Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); router.errorHandler(HttpResponseStatus.SERVICE_UNAVAILABLE.code(), ctx -> { ctx.end("something went to wrong, try it later."); });
复制代码
router.get("/demos").handler(request -> { request.json(demos);});
复制代码
router.post("/demo").handler(request -> { Demo demo = request.body().asPojo(Demo.class); if (!demos.containsKey(demo.getKey())) { demos.put(demo.getKey(), demo); request.end("record had been added."); } else { request.response().setStatusCode(HttpResponseStatus.NOT_ACCEPTABLE.code()); request.end("no record has been added"); }
});
复制代码
router.put("/demo/:key").handler(request -> { String key = request.pathParam("key"); Demo demo = request.body().asPojo(Demo.class); if (demos.containsKey(key)) { demos.put(demo.getKey(), demo); request.end("record had been updated."); } else { request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code()); request.end("no record exists."); }
});
复制代码
router.delete("/demo/:key").handler(request -> { String key = request.pathParam("key"); Demo demo = demos.remove(key); if (demo != null) { request.response().setStatusCode(HttpResponseStatus.NO_CONTENT.code()); request.end(); } else { request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code()); request.end("no record found."); }
});
复制代码
启动
./mvnw clean compile exec:java
复制代码
评论