路由时如何在请求中传递参数(服务器端 Swift 使用 Vapor)
How to pass parameters in request while routing (Server Side Swift using Vapor)
我正在 Swift 中使用 Vapor 框架编写 Web 服务。
在我的应用程序中,我有用户模型。以下是我如何为所有用户发送 get 请求。
router.get("users") { request in
return User.query(on: request).all()
}
在本地 运行 服务器之后,为了获取用户,我可以发出类似 localhost:8080/users
的请求
现在,我想将参数添加到请求中以获得超过给定年龄的用户。该请求将类似于 localhost:8080/users?above_age=25
如何使用Vapor框架在请求中添加参数?
我尝试使用 available docs 但我无法理解。
由于我现在开始使用 Vapor 的服务器端 Swift,任何对使用 Vapor 3 的资源的引用也将有助于解决我可能面临的其他问题。谢谢!
常用代码:
struct UserFormInput: Codable {
let aboveAge: UInt
enum CodingKeys: String, CodingKey {
case aboveAge= "above_age"
}
}
使用 slug 格式的 GET(不是最适合这个用例的):
localhost:8080/users/above_age/25
router.get("users", "above_age", Int.parameter) { req in
let age = try req.parameters.next(Int.self)
return "user id: \(age)"
}
参考文献:
使用带有 URL 编码参数的 GET(使用之前的答案更新):
localhost:8080/users?above_age=25
router.get("users") { request -> Future<[User]> in
let minimumAge = try? request.query.get(Int.self, at: "above_age")
// do something
}
或
router.get("users") { request -> Future<[User]> in
let userQuery = try req.query.decode(UserFormInput.self)
// do something
}
参考文献:
使用POST:
router.post("users") { req in
return try req.content.decode(UserFormInput.self)
.flatMap { input in
return // do something
}
}
参考文献:
查询字符串参数将在查询容器中,因此可以像下面那样访问它们。
router.get("users") { request -> Future<[User]> in
if let minimumAge = request.query[Int.self, at: "above_age"] {
return User.query(on: request).filter(\.age > minimumAge).all()
}
return User.query(on: request).all()
}
如果请求有 above_age 作为查询参数,路由器将 return 超过该年龄的用户列表,否则它将 return 所有用户。
我正在 Swift 中使用 Vapor 框架编写 Web 服务。
在我的应用程序中,我有用户模型。以下是我如何为所有用户发送 get 请求。
router.get("users") { request in
return User.query(on: request).all()
}
在本地 运行 服务器之后,为了获取用户,我可以发出类似 localhost:8080/users
现在,我想将参数添加到请求中以获得超过给定年龄的用户。该请求将类似于 localhost:8080/users?above_age=25
如何使用Vapor框架在请求中添加参数? 我尝试使用 available docs 但我无法理解。
由于我现在开始使用 Vapor 的服务器端 Swift,任何对使用 Vapor 3 的资源的引用也将有助于解决我可能面临的其他问题。谢谢!
常用代码:
struct UserFormInput: Codable {
let aboveAge: UInt
enum CodingKeys: String, CodingKey {
case aboveAge= "above_age"
}
}
使用 slug 格式的 GET(不是最适合这个用例的):
localhost:8080/users/above_age/25
router.get("users", "above_age", Int.parameter) { req in
let age = try req.parameters.next(Int.self)
return "user id: \(age)"
}
参考文献:
使用带有 URL 编码参数的 GET(使用之前的答案更新):
localhost:8080/users?above_age=25
router.get("users") { request -> Future<[User]> in
let minimumAge = try? request.query.get(Int.self, at: "above_age")
// do something
}
或
router.get("users") { request -> Future<[User]> in
let userQuery = try req.query.decode(UserFormInput.self)
// do something
}
参考文献:
使用POST:
router.post("users") { req in
return try req.content.decode(UserFormInput.self)
.flatMap { input in
return // do something
}
}
参考文献:
查询字符串参数将在查询容器中,因此可以像下面那样访问它们。
router.get("users") { request -> Future<[User]> in
if let minimumAge = request.query[Int.self, at: "above_age"] {
return User.query(on: request).filter(\.age > minimumAge).all()
}
return User.query(on: request).all()
}
如果请求有 above_age 作为查询参数,路由器将 return 超过该年龄的用户列表,否则它将 return 所有用户。