我学习了Java中的Vert.x框架。我正在尝试使用Router
和Vert.x web
创建一个简单的API。下面是我的代码:
我的主班-MainVerticle.java
(垂直):
public class MainVerticle extends AbstractVerticle{
final int VA_PORT = 7535;
@Override
public void start() throws Exception {
// URL routers
IController controller = new RequestController();
Router router = Router.router(vertx);
router.post("/vassist").handler(
routingContext -> controller.opController(routingContext)
);
vertx.createHttpServer().requestHandler(router::accept).listen(VA_PORT, asyncResult -> {
if(asyncResult.succeeded()) {
LOGGER.info("Verticle deployed successfully. Listening on port: " + VA_PORT);
}
else {
LOGGER.error("Could not start a HTTP server", asyncResult.cause());
}
});
}
@Override
public void stop() throws Exception {
}
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
// Deploy main verticle
vertx.deployVerticle(new MainVerticle());
}
}
接口-IController.java
:
public interface IController {
public void opController(RoutingContext routingContext);
}
RequestController.java
实现上述接口:
public class RequestController implements IController {
@Override
public void opController(RoutingContext routingContext) {
JsonObject jso = routingContext.getBodyAsJson();
System.out.println("Received json body as : " + jso.encodePrettily());
}
}
上面的代码成功地部署了verticle并创建了一个http服务器,但是,每当我发送带有示例json
主体的HTTP POST时,在{{ 1}}。
我的HttpServer实现不正确吗?请注意,我不想将http请求处理程序写为System.out.println("Received json body as : " + jso.encodePrettily());
的{{1}}方法内的匿名函数。
答案 0 :(得分:2)
问题现在已解决。问题是我没有在opController方法中为接收到的请求实现bodyhandler。正确的实现如下:
public void opController(RoutingContext routingContext) {
routingContext.request().bodyHandler(bodyHandler -> {
JsonObject jso = bodyHandler.toJsonObject();
System.out.println("Received json body as : " + jso.encodePrettily());
});
// Complete request
routingContext.response().setStatusCode(200).end("Done!");
}
答案 1 :(得分:0)
您可以通过定义一次一次 BodyHandler来简化操作,并将该主体作为缓冲区,字符串,json或json数组(例如,波纹管)获取:
public class HttpServer extends AbstractVerticle {
@Override
public void start(Future<Void> startFuture) {
var router = Router.router(vertx);
//notice here
router.route().handler(BodyHandler.create());
// a bonus :)
router.route().handler(LoggerHandler.create(LoggerFormat.DEFAULT));
router.post("/api/books").handler(this::getAllBooks);
vertx.createHttpServer()
.requestHandler(router)
.listen(config().getInteger("server.port", 9000), lh -> startFuture.complete());
}
private void getAllBooks(RoutingContext rc) {
// do something with the body
JsonObject jso = rc.getBodyAsJson(); // or String body = getBodyAsString();
System.out.println("Received json body as : " + jso.encodePrettily());
//respond
rc.response().setStatusCode(HttpResponseStatus.OK.code()).end("Done!");
}
}
答案 2 :(得分:0)
Vertx HttpServer 将捕获路由处理程序中发生的所有异常,然后返回状态代码 = 500(= 内部服务器错误)的 http 响应。所以http服务器不会因任何异常而停止。
使用“try catch”来捕获异常,例如:
String abc = null;
try {
// add your code here
abc.charAt(0);
} catch (Exception e) {
e.printStackTrace();
}
处理异常的其他方式:
router.route("/*").failureHandler(rc->{
int statusCode = rc.statusCode();
System.out.println("status code = " + statusCode );
rc.response().setStatusCode(statusCode).end("failureHandler here");
});