Как получить параметры из запроса POST из HTML-формы в Actix-web? - PullRequest
0 голосов
/ 03 июля 2018

Я создаю небольшое веб-приложение в Actix-web, но я не могу найти ни одного примера получения параметров из запроса POST в Actix-web.

Поиск их превосходных примеров РЕПО дает только пару из (для меня) значимых примеров , но они оба имеют дело с JSON, а не с данными формы.

Я также нашел эту страницу , на которой, я подозреваю, содержится ответ; но новичку это не сильно поможет.

Я думаю, это должно выглядеть примерно так:

<form method="POST">
    <input type="password" name="password">
    <button type="submit">Login</button>
</form>

и

fn main() {
    // ...
    App::with_state(AppState { db: pool.clone() })
        .middleware(IdentityService::new(
            CookieIdentityPolicy::new(&[0; 32])
                .name("auth-cookie")
                .secure(true),
        ))
        .resource("/login", |r| {
            r.method(http::Method::GET).with(login);
            r.method(http::Method::POST).with(perform_login) // help!
        })
}

struct LoginParams {
    password: String,
}    

fn perform_login(mut req: HttpRequest<AppState>, params: LoginParams) -> HttpResponse {
    if params.password == "abc123" {
        req.remember("logged-in".to_owned());
        // redirect to home
    };
    // show "wrong password" error
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете использовать экстрактор:

  • Определение структуры, которую можно десериализовать из необработанных данных.
  • Определение обработчика, который принимает экстрактор. В вашем случае используйте Form , как сказал Николай , с параметром типа вашей структуры.
  • Зарегистрируйте этот обработчик.

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

Вот немного более полный:

Определить структуру

#[derive(Deserialize)]
struct AddHook {
    id: u64,
    title: String,
    version: Option<String>,
    code: Option<String>
}

Определить обработчик

fn remove_hook_del((query, state): (Form<AddHook>, State<AppState>)) -> FutureHttpResponse {
    let query = query.into_inner();
    let AddHook {id, title, version, code} = query;

    //Do something with your data
}

Обработчик регистра

App::with_state(AppState::new()).resource("/remove_hook", |res| {
    res.method(Method::GET).with(remove_hook_get);
    res.method(Method::DELETE).with(remove_hook_del);
    res.route().f(not_allowed);
})

Это более или менее полный пример для текущей основной ветви actix-web. Я также сделал это с помощью состояния, чтобы показать, как вы можете использовать несколько аргументов в вашем обработчике

0 голосов
/ 03 июля 2018

Вам нужно Форма экстрактор. params: Form<LoginParams>

...