2015-12-07 295 views
0

我是一個有vertx的新手,所以也許我做錯了什麼。我試圖實現以下路線: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。不管參數是否位於路徑末尾或中間位置,它都沒有區別。

對於以星號結尾的路徑也是如此。當路徑包含參數時,此功能不起作用。

回答

0

您可以使用正則表達式來避免重複使用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);