Как передать параметры в запросе при маршрутизации (Server Side Swift с использованием Vapor) - PullRequest
1 голос
/ 28 апреля 2019

Я пишу веб-сервис с использованием Vapor Framework в Swift.

В моем приложении есть модель User.Ниже описано, как я маршрутизирую запрос get для всех пользователей

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

После локального запуска сервера, чтобы получить пользователей, я могу сделать запрос вроде localhost:8080/users

Теперь я хочу добавить параметр в запрос, чтобы пользователи вышеданный возраст.Запрос будет выглядеть так: localhost:8080/users?above_age=25

Как добавить параметр в запрос с использованием инфраструктуры Vapor?Я попытался с доступными документами , но я не могу понять это.

Поскольку я сейчас начинаю с Server Side Swift с использованием Vapor, любая ссылка на ресурсы с использованием Vapor 3 также будет полезна для решения других проблем, с которыми я могу столкнуться.Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

Параметры строки запроса будут находиться в контейнере запроса и, следовательно, к ним можно получить доступ, как показано ниже.

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

Если для запроса в качестве параметра запроса указано значение visible_age, маршрутизатор вернет список пользователей старше этого возраста, иначе он вернет всех пользователей.

1 голос
/ 28 апреля 2019

Общий код:

struct UserFormInput: Codable {
    let aboveAge: UInt

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

Использовать 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)"
}

Ссылки:


Использование 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
            }
}

Рекомендации:

...