我是Java和后端开发的新手,我真的需要一些帮助。
我目前正在使用Vert。x来开发一个服务器,它接受Json请求,告诉该服务器要分析哪个文件,服务器分析该文件并以Json格式给出响应。
我已经创建了一个imagerrecognition类,其中有一个方法叫做"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
对象。我不确定这是否线程安全,但更常见的做法是在请求处理程序内部分配JsonObject对象,并使用RoutingContext.data()
将它们传递给后续处理程序。
2:您的两个处理程序不在同一个方法上(第一个是GET,第二个是POST)。我想你希望它们都是POST。
3:为了提取多部分主体数据,您需要使用POST,而不是GET。
4:您需要在读取请求体的任何处理程序之前附加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()
将返回null。
根据RoutingContext#getBodyAsJson的文档,"上下文必须首先被路由到一个BodyHandler来填充。">
阅读更多:BodyHandler.