Vapor のルーティング周りについて詰まったことが多かったので、まとめてみました。
Vapor のルーティングは routes.swift
に記述していきます。
環境
この記事では以下の環境で動作を確認しています。
- swift 5.0
- vapor 3.3.0
基本的なルーティング
// GET /user
router.get("user") { req in
return "/user"
}
パラメータの型を指定(String)
// GET /onetime/:key
router.get("onetime", String.parameter) { req -> String in
let key = try req.parameters.next(String.self)
return "/onetime/\(key)"
}
パラメータの型を指定(Int)
// GET /users/:userId
router.get("user", Int.parameter) { req -> String in
let userId = try req.parameters.next(Int.self)
return "/user/\(userId)"
}
/user/xxxx
のような Int
に変換できないパラメータを渡すと以下のレスポンスが返ります。
{
"error": true,
"reason": "The parameter was not convertible to an Int"
}
パラメータの後ろにエンドポイントを設定
// GET /user/:userId/profile
router.get("user", Int.parameter, "/profile") { req -> String in
let userId = try req.parameters.next(Int.self)
return "/user/\(userId)/profile"
}
複数のパラメータ
// GET /user/:userId/post/:postId
router.get("user", Int.parameter, "/post", Int.parameter) { req -> String in
let userId = try req.parameters.next(Int.self)
let postId = try req.parameters.next(Int.self)
return "/user/\(userId)/post/\(postId)"
}
グループによるルーティング
// GET /api/v0/user
router.group("api") { api in
api.group("v0") { v0 in
v0.get("user") { v0 in
return "/api/v0/user"
}
}
}
###参考