Vert.x 学习笔记5 创建httpServer
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 中文翻译文档