在 Vertx 中获取和 post Json 对象的方法

Method to get and post Json object in Vertx

我是 Java 和后端开发的新手,我真的需要一些帮助。

我目前正在使用 Vert.x 开发一个接受 Json 请求的服务器,该请求告诉该服务器要分析哪个文件,服务器分析该文件并在 Json格式。

我创建了一个 ImageRecognition class,其中有一个名为“getNum”的方法,它获取 json 作为输入并输出包含结果的 json。

但我目前无法从请求中获取 Json 文件。

public void start(Promise<Void> startPromise) throws Exception {
JsonObject reqJo = new JsonObject();

Router router = Router.router(vertx);
router.get("/getCall").handler(req ->{
  JsonObject subJson = req.getBodyAsJson();
  reqJo.put("name", subJson.getValue("name"));
  req.end(reqJo.encodePrettily());
});
router.post("/getCall").produces("*/json").handler(plateReq ->{
  plateReq.response().putHeader("content-tpye", "application/json");
  JsonObject num = imageRecogService.getNum(reqJo);
  plateReq.end(num.encodePrettily());
});
vertx.createHttpServer().requestHandler(router).listen(8080)
  .onSuccess(ok -> {
    log.info("http server running on port 8080");
    startPromise.complete();
  })
  .onFailure(startPromise::fail);

} }

任何对代码的反馈或解决方案都将不胜感激!! 提前致谢!!

您的代码中有几个错误:

1:

JsonObject reqJo = new JsonObject();

Router router = Router.router(vertx);
router.get("/getCall").handler(req ->{
  reqJo.put("name", subJson.getValue("name"));
});

您正在修改处理程序中的 reqJo object。我不确定这是否是线程安全的,但更常见的做法是在请求处理程序内部分配 JsonObject object 并使用 RoutingContext.data().

将它们传递给后续处理程序

2: 您的两个处理程序不在同一个方法上(第一个是 GET,而第二个是 POST)。我假设您希望它们都是 POST.

3: 为了提取多部分 body 数据,您需要使用 POST,而不是 GET。

4: 您需要在任何读取请求 body 的处理程序之前附加一个 BodyHandler。例如:

// Important!
router.post("/getCall").handler(BodyHandler.create());
// I changed to posts
router.post("/getCall").handler(req ->{
  JsonObject subJson = req.getBodyAsJson();
  reqJo.put("name", subJson.getValue("name"));
  req.end(reqJo.encodePrettily());
});

否则,getBodyAsJson() 将 return 为空。

根据 Document of RoutingContext#getBodyAsJson,“上下文必须首先被路由到 BodyHandler 才能被填充。”

阅读更多:BodyHandler.