1

私は頂点の初心者なので、何か間違っているかもしれません。次のルートを実装しようとしています。

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 を返します。パラメーターがパスの末尾にあるか途中にあるかは関係ありません。

星で終わるパスも同様です。この機能は、パスにパラメーターが含まれている場合は機能しません。

4

1 に答える 1

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);
于 2015-12-10T00:26:31.050 に答える