vertx 中的可选路径参数

Optional path parameter in vertx

我想使用获取请求在单个端点获取可选路径参数。例如:-

如果用户点击以下 api :-

  1. /metric/monitor/:id 要么 /指标/:id

这里的 id 是路径参数,我需要使用 get 请求在单个端点路由到相同的函数。我该怎么做?

您可以使用正则表达式指定路由。 假设id是一个数字:

router.getWithRegex( "\/metric(\/monitor)?\/(?<ID>\d+)" ).respond( this::monitor );

然后读取值:

long id = Long.parseLong( ctx.pathParam( "ID" ) );

这是我通常使用 Vert.x Web 4.3.1 声明路由的方式:

public class MyVerticle extends AbstractVerticle {

    @Override
    public void start(Promise<Void> startPromise) {
        Router router = Router.router( vertx );
        BodyHandler bodyHandler = BodyHandler.create();
        router.post().handler( bodyHandler );

        router.getWithRegex( "\/metric(\/monitor)?\/(?<ID>\d+)" ).respond( this::monitor );

        // Keeping track of it so that I can close it later
        this.httpServer = vertx.createHttpServer();
        final Future<HttpServer> startHttpServer = httpServer
                .requestHandler( router )
                .listen( HTTP_PORT )
                .onSuccess( v -> LOG.infof( "✅ HTTP server listening on port %s", HTTP_PORT ) );

        startHttpServer
                .onSuccess( s -> startPromise.complete() )
                .onFailure( startPromise::fail );
    }

    private Future<Result> monitor(RoutingContext ctx) {
        long id = Long.parseLong( ctx.pathParam( "ID" ) );
        Result result = ... // Do something
        return Future.succeededFuture(result);
    }

文档中提供了有关 routing with regular expressions 的更多详细信息。

但是,公平地说,对于这种情况,创建两个单独的入口点似乎更容易:

router.get( "/metric/monitor/:id" ).respond( this::monitor );
router.get( "/metric/:id" ).respond( this::monitor );