Vert.x 学习笔记5 创建httpServer

HttpServer server = vertx.createHttpServer(); // 译者注:配置服务器监听指定的主机和端口的例子:
vertx.createHttpServer(new HttpServerOptions().setPort(8080).setHost("0.0.0.0"))
  • 若您希望在服务器实际监听时收到通知,您可以向 listen 提供一个处理器。 例如:
HttpServer server = vertx.createHttpServer();
server.listen(8080, "myhost.com", res -> {
  if (res.succeeded()) {
    System.out.println("Server is now listening!");
  } else {
    System.out.println("Failed to bind!");
  }
});
  • 处理http 请求
HttpServer server = vertx.createHttpServer();
server.requestHandler(request -> {
  // Handle the request in here
}).listen(8080);
  • 同时建立两个http 请求
 @Override
  public void start(Promise<Void> startPromise) {
    var httpServer = vertx.createHttpServer();
    httpServer.requestHandler(
      server -> {
        var test = server.getParam("test");
        var response = server.response();
        if(test!=null){
          response.end("{\"success\":200}");
        }else response.end("{\"success\":500}");
      }
    ).listen(8080);
    var httpServer2 = vertx.createHttpServer();
    httpServer2.requestHandler(
      server -> {
        var test = server.getParam("test");
        var response = server.response();
        if(test!=null){
          response.end("{\"success\":200}");
        }else response.end("{\"success\":500}");
      }
    ).listen(7777);
  }

常用参数获取

  • 使用 method 方法读取请求中的 HTTP 方法。 (即GET、POST、PUT、DELETE、HEAD、OPTIONS等)。
  • 使用 uri 方法读取请求中的URI路径。
  • 请注意,这是在HTTP请求中传递的实际URI,它总是一个相对的URI。
  • 这个URI是在 Section 5.1.2 of the HTTP specification - Request-URI 中定义的。
  • 使用 path方法读取URI中的路径部分。
  • 使用 query读取URI中的查询部分。
  • 使用 headers方法获取HTTP请求中的请求头部信息。
  • 使用 host方法返回HTTP请求中的主机名。
  • 可以使用 remoteAddress方法读取请求发送者的地址。
  • HTTP 请求中传递的URI通常是相对的,若您想要读取请求中和相对URI对应的绝对URI, 可调用 absoluteURI方法。
  • 当整个请求(包括所有请求体)已经被完全读取时,请求中的 endHandler方法会被调用。
@Override
  public void start(Promise<Void> startPromise) {
    var httpServer = vertx.createHttpServer();
    var httpServer2 = vertx.createHttpServer();
    httpServer2.requestHandler(
      server -> {
        var test = server.getParam("test");
        System.out.println("method is " + server.method());
        System.out.println("uri is " + server.uri());
        System.out.println("path is " + server.path());
        System.out.println("query is " + server.query());
        System.out.println("headers is " + server.headers());
        System.out.println("host is " + server.host());
        System.out.println("params is " + server.params());
        System.out.println("remoteAddress is " + server.remoteAddress());
        System.out.println("absoluteURI is " + server.absoluteURI());
        server.endHandler( // endHandler 永远在最后被执行 无论你写在哪里
          _void -> System.out.println("end handler")
        );
        var response = server.response();
        if (test != null) {
          response.end("{\"success\":200}");
        } else response.end("{\"success\":500}");
      }
    ).listen(7777);
  }

处理form表单请求

server.requestHandler(request -> {
  request.setExpectMultipart(true);
  request.endHandler(v -> {
    // The body has now been fully read, so retrieve the form attributes
    MultiMap formAttributes = request.formAttributes();
  });
});

处理文件上传

  • Vert.x 可以处理以 multipart 编码形式上传的的文件。
  • 要接收文件,您可以告诉 Vert.x 使用 multipart 表单,并对请求设置 uploadHandler。
  • 当服务器每次接收到上传请求时, 该处理器将被调用一次。
  • 传递给处理器的对象是一个 HttpServerFileUpload实例。
server.requestHandler(request -> {
  request.setExpectMultipart(true);
  request.uploadHandler(upload -> {
    System.out.println("Got a file upload " + upload.name());
  });
});
  • 上传的文件可能很大,我们不会在单个缓冲区中包含整个上传的数据,因为这样会导致内存耗尽。 相反,上传数据是以块的形式被接收的:
request.uploadHandler(upload -> {
  upload.handler(chunk -> {
    System.out.println("Received a chunk of the upload of length " + chunk.length());
  });
});
  • 若您只是想将文件上传到服务器磁盘的某个地方,可以使用 streamToFileSystem方法:
request.uploadHandler(upload -> {
  upload.streamToFileSystem("myuploads_directory/" + upload.filename());
});

返回响应

  • 服务器响应对象是一个 HttpServerResponse 实例, 它可以从request对应的 response方法中读取。
  • 您可以使用响应对象回写一个响应到 HTTP客户端。
  • 默认的 HTTP 状态响应码为 200,表示 OK。
  • 可使用 setStatusCode方法设置不同状态代码。
  • 使用end 传递json 指定响应的json。
  • response.putHandler 添加响应头。

处理异常

  • 调用 exceptionHandler可以设置一个处理器,用于接收 连接传递给 requestHandler 之前发生的异常, 或者是传递给 webSocketHandler之前发生的异常,如TLS握手期间发生的异常。

http 客户端

HttpClient client = vertx.createHttpClient();

发送请求

 var httpClient = vertx.createHttpClient();
    httpClient.request(
      HttpMethod.GET,"https://www.baidu.com", i -> {
       if(i.succeeded()){
          // do SomeThing
       }else {
         System.err.println("fail");
       }
      }
    );

结束HTTP请求流

  • 一旦完成了 HTTP 请求的准备工作,您必须调用其中一个 end方法来 发送该请求(结束请求)。
  • 结束一个请求时,若请求头尚未被写入,会导致它们被写入,并且请求被标记 成完成的。
  • 请求可以通过多种方式结束。无参简单结束请求的方式如:
 var httpClient = vertx.createHttpClient();
    httpClient.request(
      HttpMethod.GET,"https://www.baidu.com")
      .onSuccess(
        i -> {
          System.out.println("success");
          i.end();
        }
      ).onFailure(
        Throwable::printStackTrace
      );

转载自 vertx 中文翻译文档