【问题标题】:Vertx router configurationVertx 路由器配置
【发布时间】:2015-12-07 13:47:39
【问题描述】:

我是 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。参数是在路径的末尾还是在中间都没有区别。

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

【问题讨论】:

    标签: vert.x vertx3


    【解决方案1】:

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

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2021-03-10
      • 2016-08-03
      • 2021-10-17
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多