java - 如何从RoutingContext中获取消息体?

标签 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])

如何避免此异常并始终获取完整消息?

最佳答案

您应该指定 HTTP 方法

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

期待 HTTP GET,但您需要的是 HTTP POST:

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

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

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

关于java - 如何从RoutingContext中获取消息体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56390175/

相关文章:

java - 如何在 JavaFX 15-ea+3 中设置应用程序图标

java - java中的静态方法继承

java - 可以在 gwt 中设置 native 滚动条的样式,而不定义自定义滚动条并且不使用 ScrollPanel 或 CustomScrollPanel?

java - 在执行gradle run时防止JVM终止

java - mainClassName的etter : String' is deprecated.在Java中已弃用

java - [vert.x]Vertx tcp 套接字在写入快速时读取部分消息

java - 如何将 SQL 日期时间戳转换为人类可读的时间?

java - 正则表达式拆分不起作用

java - 如何将 Future 转换为 Uni?

java - Vert.x Http 请求未将参数分配为配置