当前位置: 首页 > 知识库问答 >
问题:

Vertx路由器配置

轩辕煌
2023-03-14

我是vertx的新手,所以可能我做错了什么。我正在尝试实施以下路线:

router.get("/api/users/").handler(this::getUsers);
router.route("/api/users/:username*").handler(this::checkUsername);
router.get("/api/users/:username/").handler(this::getUser);
router.put("/api/users/:username/").handler(this::addUser);
router.get("/api/users/:username/assignments/").handler(this::getAssignments);
router.post("/api/users/:username/assignments/").handler(this::addAssignment);
router.route("/api/users/:username/assignments/:assignmentId/").handler(this::checkAssignmentId);
router.get("/api/users/:username/assignments/:assignmentId/").handler(this::getAssignment);

这是避免在所有处理程序中重复此逻辑的正确方法吗?

我试图链接处理程序,checkUsername处理程序从路径中读取username参数,试图找到相应的用户,并将该用户放入上下文中。如果未找到用户,则返回状态代码400。否则将调用下一个处理程序。我想对assignmentId参数应用相同的原则。

在尝试实现这一点时,我认为我发现了路径的问题,更具体地说是尾部的斜线和星形。文档中指出,后面的斜杠将被忽略。这不是路径中有参数时的行为。在这种情况下,后面的斜杠很重要。如果路径定义包含一个,而请求没有,vertx将返回404。无论参数是在路径的末端还是在中间,都没有区别。

以恒星结尾的路径也是如此。当路径包含参数时,此功能不起作用。

共有1个答案

甄正信
2023-03-14

您可以使用正则表达式来避免重复检查用户名验证检查。我要做的是,我会有一个这样的方法来检查用户名是否有效:

private void checkUsername(RoutingContext routingContext){

    //The "param0" is the capture group of the regular expression. See the routing config below.
    if (isValidUsername(routingContext.request().getParam("param0"))){

        routingContext.next();

    } else {

        routingContext
            .response()
            .setStatusCode(400)
            .end();

    }

}

要检查作业ID,我会做类似的操作:

private void checkAssignmentId(RoutingContext routingContext){

    if (isValidAssignmentId(routingContext.request().getParam("assignmentId"))){

        routingContext.next();

    } else {

        routingContext
            .response()
            .setStatusCode(400)
            .end();

    }

}

尽量避免在你的路径上留下斜线。我会将路由处理程序分配更改为如下内容:

router.get("/api/users").handler(this::getUsers);

//By the way, you really want to be using a POST request when adding users just to stick to the principles of REST.
//When you are sending a POST request there is no need to put the username in the URI. You can have it in the request body.
//Please ensure you validate this username using the same validation helper used in your other validations.
router.post("/api/users").handler(this::addUser);

//Use regular expression to match all "/api/users/:username*" URIs
router.routeWithRegex("\\/api\\/users\\/([^\\/]+)").handler(this::checkUsername);
router.get("/api/users/:username").handler(this::getUser);

router.get("/api/users/:username/assignments").handler(this::getAssignments);
router.post("/api/users/:username/assignments").handler(this::addAssignment);

router.route("/api/users/:username/assignments/:assignmentId").handler(this::checkAssignmentId);
router.get("/api/users/:username/assignments/:assignmentId").handler(this::getAssignment);
 类似资料:
  • 我是vertx web的新手。我正在使用ruby vertx web构建web应用程序。我想提供静态文件(index.html)。和我的索引。html打包在webroot文件夹中。我的索引。将为加载html文件http://localhost:8088.我需要提供索引。用于localhost:8088/demo或localhost:8088/test或http://localhost:8088/*

  • 每个路由可以有不同的属性; 一些常见的属性是: path - 应用程序在特定路由上时在浏览器中显示的URL component - 当应用程序在特定路由上时要呈现的组件 pathMatch - 默认为’prefix’的可选属性。 确定是匹配完整的网址还是仅匹配开头。 当定义一个具有空路径字符串的路径设置pathMatch为’full’时,否则它将匹配所有路径。 children - 表示此路由的子

  • Tango支持4种形式的路由匹配规则 静态路由 tg.Get("/", new(Action)) tg.Get("/static", new(Action))匹配 URL:/ 到 Action结构体的Get函数 匹配 URL:/static 到 Action结构体的Get函数 命名路由 tg.Get("/:name", new(Action)) tg.Get("/(:name)", new(Act

  • 我已经创建了反应应用程序与顶点以下https://how-to.vertx.io/single-page-react-vertx-howto/.我已经设置反应路由使用反应路由器工作正常当我使用内部反应节点服务器运行在localhost:3000default.But当我trid通过vertx静态处理程序提供静态页面除了默认/路由其他路由返回“未找到”输入图像描述在这里

  • 路由配置 路由的作用 路由配置是 CAT 集群流量负载均衡最重要的一环。路由配置提供了默认机器列表、多机房划分、地域划分等基本功能,路由选择的优先级为:同机房 > 同地域 > 默认机器 > 备用机器。 对于流量较高的机器,用户可以扩展相应的策略,通过路由配置将部分流量指定到低负载的机器。 配置入口 http:///localhost:8080/s/config?op=routerConfigUpd

  • V2Ray 内建了一个简单的路由功能,可以将入站数据按需求由不同的出站连接发出,以达到按需代理的目的。这一功能的常见用法是分流国内外流量,V2Ray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。 RoutingObject RoutingObject 对应主配置文件中的routing项。 { "domainStrategy": "AsIs", "rules": []