VERTX中的可选路径参数

发布于 2025-02-03 00:11:58 字数 173 浏览 1 评论 0原文

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

如果用户点击API以下: -

  1. /Metric/Monitor/:ID 或者 /metric/:ID

此处的ID是路径参数,而不是我需要使用Get Request在单个终点中路由到同一函数。我该怎么做?

I want to use a get request to get optional path parameters in a single end point . For example :-

if user hit below api :-

  1. /metric/monitor/:id
    or
    /metric/:id

here id is path parameter than i need to route to the same function in a single end point using get request. How can i do the same ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娜些时光,永不杰束 2025-02-10 00:11:58

您可以使用正则表达式指定路由。
假设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);
    }

有关带有正则表达式的路由在文档中可用。

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

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

You can specify a route using regular expressions.
Assuming the id is a number:

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

and then read the value:

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

This is how I usually declare the route using 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);
    }

More details about routing with regular expressions are available in the documentation.

But, to be fair, creating two separate entry points seems easier for this case:

router.get( "/metric/monitor/:id" ).respond( this::monitor );
router.get( "/metric/:id" ).respond( this::monitor );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文