vertx 中的可选路径参数
Optional path parameter in vertx
我想使用获取请求在单个端点获取可选路径参数。例如:-
如果用户点击以下 api :-
- /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 );
我想使用获取请求在单个端点获取可选路径参数。例如:-
如果用户点击以下 api :-
- /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 );