如何从RoutingContext获取消息正文?

时间:2019-05-31 06:58:21

标签: java vert.x

我创建了一个vert.x HTTP服务器,并且希望以json格式接收来自客户端的消息。 这是我的代码:

public class HttpServerVerticle extends AbstractVerticle {
    @Override
    public void start(Future<Void> future) {
        Router router = Router.router(vertx)
            .exceptionHandler(ex -> log.error("Error: " + ex));
        router.route().handler(BodyHandler.create());
        router.route("/getData").handler(this::getRequestHandler);

        HttpServerOptions serverOptions = new HttpServerOptions();
        vertx.createHttpServer(serverOptions)
                .requestHandler(router::accept)
                .listen(9539, result -> {
                    if (result.succeeded()) {
                        future.complete();
                    } else {
                        future.fail(result.cause());
                    }
                });
    }

    private void getRequestHandler(RoutingContext request) {
        JsonObject data = request.getBodyAsJson();  // In this place I had exception
        ...
        request.response().end("{\"reply\":\"ok\"}");
    }
}

当我的处理程序着火时,我从客户端收到一些消息,我得到了这个异常:

io.vertx.core.json.DecodeException: Failed to decode:Unexpected end-of-input: expected close marker for Object (start marker at [Source: (String)"{"ClientRequest":["ok"],"Type":"Test"[truncated 678 chars]; line: 1, column: 1])

如何避免这种例外情况并始终获得完整的消息?

2 个答案:

答案 0 :(得分:0)

您应指定HTTP方法

router.route("/getData").handler(this::getRequestHandler);

期望使用HTTP GET,但是您需要的是HTTP POST:

router.post("/getData")
  .consumes("application/json")
  .handler(this::getRequestHandler);

将接受正文中的json。消费是可选的,可强制客户端仅发送json。

我还建议将路由命名为“ / data”而不是“ / getData”,以符合RESTful API的概念。

答案 1 :(得分:0)

客户端可能没有发送有效的json。 在这种情况下,这是一个有效的例外。 为了记录请求,您可以在执行getBodyAsJson()之前简单地使用request.getBodyAsString()