しおしお

IntelliJ IDEAのことなんかを書いてます

Ktorのルーティング設定で正規表現を使ってみる

Ktorの2.3.0からルーティング設定で正規表現が使えるようになったらしいので試してみたよ。

ルーティング設定で正規表現を使ってみる

お試しコード

ルーティング設定での正規表現の指定方法は、文字列ではなくkotlin.text.Regexを指定してあげる形になります。 あとは、普段使い慣れた正規表現でマッチさせたいパスを表現してあげればOKです。

routing {
    get(Regex("[a-z]+")) {
        call.respondText("uri: ${call.request.uri}")
    }
}

実行結果

正規表現にマッチするパスを指定すると、実装通りの結果がレスポンスで返って来ています。

curl -i http://localhost:8080/aaaaa
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain; charset=UTF-8

uri: /aaaaa%    

正規表現にマッチしないパスを指定すると、ルーティングの設定にマッチしないので404が返ってくることが確認できます。

curl -i http://localhost:8080/aaA
HTTP/1.1 404 Not Found
Content-Length: 0

パスパラメータで正規表現を使ってみる

お試しコード

パスパラメータとして正規表現を使いたい場合には、(?<パスパラメータの名前>正規表現)kotlin.text.Regexに指定します。 下のコードの場合には、idという名前で数値のみに限定したパスパラメータを定義しています。

routing {
    get(Regex("""(?<id>\d+)""")) {
        call.respondText("id: ${call.parameters["id"]}")
    }
}

実行結果

パスパラメータにマッチする数字のみを指定すると、実装通りの結果がレスポンスで返って来ています。 正規表現を使った場合でも、パスパラメータの値を取得できていることもこれで確認できますね。

curl -i http://localhost:8080/123
HTTP/1.1 200 OK
Content-Length: 7
Content-Type: text/plain; charset=UTF-8

id: 123%  

パスパラメータの場合も、正規表現にマッチしないパスを指定すると404が返ってくることが確認できます。

curl -i http://localhost:8080/123a
HTTP/1.1 404 Not Found
Content-Length: 0

おわり。