路由时如何在请求中传递参数(使用Vapor的Server Side Swift)

时间:2019-04-28 14:15:29

标签: swift vapor server-side-swift

我正在使用Swift中的Vapor框架编写Web服务。

在我的应用中,我具有用户模型。以下是我为所有用户路由获取请求的方式。

router.get("users") { request in
    return User.query(on: request).all()
}

在本地运行服务器后,要吸引用户,我可以发出类似localhost:8080/users

的请求

现在,我想向请求中添加参数,以使用户超过给定年龄。该请求看起来像localhost:8080/users?above_age=25

如何使用Vapor框架在请求中添加参数? 我尝试过available docs,但我不知道。

由于我现在从使用Vapor的Server Side Swift开始,因此对使用Vapor 3的资源的任何引用也将对我可能会遇到的其他问题有所帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

查询字符串参数将在查询容器中,因此可以按以下方式访问它们。

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()
}

如果请求具有upper_age作为查询参数,则路由器将返回该年龄以上的用户列表,否则它将返回所有用户。

答案 1 :(得分:1)

公用代码:

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
}

OR

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
            }
}

参考文献: