如果我在处理程序中收到HttpServerRequest,是否可以以某种方式发布请求?
我想实现一个带有index.html和未知数量的子站点的小型演示网站。首先应该有一个主vert.x模块,它启动HttpServer。在这个主模块中,应该可以添加其他相关模块。我现在称它们为子模块。我不知道稍后会有多少个子模块,但每个子模块应该包含处理特定URL(子html文件)的http响应的逻辑。我想我必须为WebSocketHandler做同样的事情......
start()中代码的一个小例子:
//My Main Module:
vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() {
public void handle(HttpServerRequest req) {
vertx.eventBus().publish("HTTP_REQUEST_CONSTANT", req);
}
}).listen(8080);
// My submodule 1
vertx.eventBus().registerHandler("HTTP_REQUEST_CONSTANT", new Handler<HttpServerRequest>() {
@Override
public void handle(HttpServerRequest req) {
if (req.uri().equals("/")) {
req.response();
}
}
});
// Other submodules which handles other URLs
还是其他任何解决方案?我只是不想在主模块中拥有子站点的逻辑。
编辑:或者我可以在每个子模块中调用vertx.createHttpServer()方法吗?
答案 0 :(得分:2)
我有一个类似的基于Vert.x的应用程序,我最终做了以下事情:
我有HttpServerVerticle
从MainVerticle
开始。在那里,我创建了一个HttpServer
与几个匹配器。每个匹配器都会收到一个请求,并通过EventBus
将其转发到专用的Verticle。在从专用Verticle获得响应后,它会将响应写入响应。
这是一段代码:
RouteMatcher restMatcher = new RouteMatcher();
EventBus eventBus = vertx.eventBus();
HttpServer httpServer = vertx.createHttpServer();
restMatcher.post("/your/url",
r -> {
r.bodyHandler(requestBody -> {
final int length = requestBody.length();
if(length == 0) {
//return bad request
r.response().setStatusCode(HttpResponseStatus.BAD_REQUEST.code());
r.response().end();
return;
}
eventBus.send("your.address.here",
requestBody.getString(0, length),
new Handler<Message<JsonObject>>(){
@Override
public void handle(Message<JsonObject> message) {
//return the response from the other verticle
r.response().setStatusCode(HttpResponseStatus.OK.code());
if (message.body() != null) {
r.response().end(message.body().toString());
}
else{
r.response().end();
}
}
});
});
});
httpServer.requestHandler(restMatcher);
httpServer.listen(yourPort,yourHost);
在专用的Verticle中,您可以将侦听器注册到地址:
vertx.eventBus().registerHandler("your.address.here", this::yourHandlerMethod);
处理程序方法如下所示:
protected void yourHandlerMethod(Message<String> message){
// do your magic, produce an answer
message.reply(answer);
}
通过这种方式,您可以将逻辑与HTTP映射分开,并且可以使用多个事件总线地址在不同的Verticle中使用不同的逻辑块。
希望这有帮助。