首页 > 解决方案 > Vertx HttpServerRequest 中的语法

问题描述

我是 Java 新手,最近在学习 Vertx,我不明白以下代码是如何工作的:

@Override
public void start() {
    vertx.createHttpServer()
        .requestHandler(req -> req.response()
          .end("hello"))
        .listen(8080);
}

我的问题是:为什么参数req不需要声明类型,这个 req 是从哪里来的?

标签: javavert.xvertx-httpclient

解决方案


让我们把它分成几块。

创建 HTTP 服务器

HttpSever使用我们的实例创建Vertx实例。

HttpServer httpServer = vertx.createHttpServer();

定义请求处理程序

现在,HttpServer我们可以为传入请求定义处理程序。

我们可以使用这个HttpServer#requestHandler(Handler<HttpServerRequest> handler)[1]。此方法采用Handler<HttpRequest>.

Handler<HttpServerRequest>因此,我们可以如下定义我们的实例:

private static class MyRequestHandler implements Handler<HttpServerRequest> {

    @Override
    public void handle(HttpServerRequest req) {
        req.response().end("Hello");
    }
}

这个处理程序只会打印"Hello"每个传入的请求。

现在我们可以将实例MyReqesutHandler与我们的httpServer实例相关联。

httpServer.requestHandler(new MyRequestHandler())

并在端口上启动 HTTP 服务器8080

httpServer.listen(8080);

使用 lambda 重构

请注意,Handler 是一个所谓的功能接口 [2],而不是定义整个类,我们可以将 lambda 函数 [3] 直接传递给httpServer.requestHandler().

我们可以避免大量的样板代码。

因此,通过使用 lambda,我们不需要定义整个类,这样做就足够了:

httpServer.requestHandler(req -> req.response().end("Hello"));

现在因为 JAVA 编译器知道httpServer.requestHandler()需要 的实例Handler<HttpServerRequest>,它可以通过查看方法声明来推断编译类型中的类型。req

使用 Fluent API 重构

由于 vert.x 促进了 Fluet API [4],我们可以在不需要中间变量的情况下链接方法。

vertx.createHttpServer()
      .requestHandler(req -> req.response().end("hello"))
      .listen(8080);

我强烈建议您查看Java lambda 教程并从中获得好感,因为它们几乎不仅在 Vert.x 中使用,而且在 Java 世界中无处不在。

玩得开心!


[1] https://vertx.io/docs/apidocs/io/vertx/core/http/HttpServer.html#requestHandler-io.vertx.core.Handler-

[2] https://www.baeldung.com/java-8-functional-interfaces

[3] https://www.geeksforgeeks.org/lambda-expressions-java-8/

[4] https://en.wikipedia.org/wiki/Fluent_interface


推荐阅读