3

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

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

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

在本地运行服务器后,为了获取用户,我可以发出如下请求localhost:8080/users

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

如何使用 Vapor 框架在请求中添加参数?我尝试了可用的文档,但我想不通。

由于我现在开始使用 Vapor 的 Server Side Swift,因此任何对使用 Vapor 3 的资源的引用也将有助于解决我可能面临的其他问题。谢谢!

4

2 回答 2

4

查询字符串参数将在查询容器中,因此可以像下面这样访问它们。

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 作为查询参数,则路由器将返回高于该年龄的用户列表,否则它将返回所有用户。

于 2019-04-28T15:20:55.877 回答
3

常用代码:

struct UserFormInput: Codable {
    let aboveAge: UInt

    enum CodingKeys: String, CodingKey {
        case aboveAge= "above_age"
    }
}

将 GET 与 slug 格式一起使用(不适合此用例):

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

参考:


将 GET 与 URL 编码参数一起使用(使用先前的答案更新):

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

参考:

于 2019-04-28T14:33:45.503 回答