2.5.3、HTTP服务器初始化
HTTP服务器利用vertx-web项目轻松定义传入HTTP请求的调度路由。事实上,Vert.x核心API允许启动HTTP服务器并监听传入连接,但是它不提供任何设施来做根据所请求URL设置不同的处理程序或处理请求主体的功能。 这是路由器的功能,路由器会根据URL,HTTP方法等将请求分派到不同处理程序处理。
初始化过程包括设置请求路由器, 然后启动HTTP服务器:
private Future<Void> startHttpServer() {
Future<Void> future = Future.future();
HttpServer server = vertx.createHttpServer(); (1)
Router router = Router.router(vertx); (2)
router.get("/").handler(this::indexHandler);
router.get("/wiki/:page").handler(this::pageRenderingHandler); (3)
router.post().handler(BodyHandler.create()); (4)
router.post("/save").handler(this::pageUpdateHandler);
router.post("/create").handler(this::pageCreateHandler);
router.post("/delete").handler(this::pageDeletionHandler);
server.requestHandler(router::accept) (5)
.listen(8080, ar -> { (6)
if (ar.succeeded()) {
LOGGER.info("HTTP server running on port 8080");
future.complete();
} else {
LOGGER.error("Could not start a HTTP server", ar.cause());
future.fail(ar.cause());
}
});
return future;
}
- vertx上下文对象提供了创建HTTP服务器及客户端,TCP / UDP服务器及客户的方法;
- 路由器类来自vertx-web:io.vertx.ext.web.Router;
- 路由有自己的处理程序,可以通过URL和/或HTTP方法进行定义。 对于 短处理程序Java lambda是一个首先选项,但是对于更详细的处理程序,引用私有方法是一个更好的主意 。请注意,URL可以携带参数:路径“/wiki/:page" 将匹配像"/wiki/Hello”这样的请求,在这种情况下,请求参数page将可用,它的值为“Hello”;
- 这让所有HTTP POST请求都通过第一个处理程序 io.vertx.ext.web.handler.BodyHandler。这个处理程序会自动从HTTP请求(例如,表单提交)中解码body,然后将解码后的内容作为Vert.x缓冲区对象进行操作;
- 路由器对象可以用作HTTP服务器的请求处理程序,路由器然后将请求发送到上述所定义的路由处理程序;
- 启动HTTP服务器是一个异步操作,因此需要检查AsyncResult <HttpServer>是否 成功。 8080参数指定服务器要使用的TCP端口。