如何从Actix-web中HTML表单的POST请求中获取参数?

时间:2018-07-03 14:06:07

标签: rust rust-actix

我在Actix-web中构建了一个小的Web应用程序,但是我找不到任何在Actix-web中从POST请求中获取参数的示例。

Searching their excellent examples repo仅给我带来couple有意义的examples,但它们都处理JSON而不处理表单数据。

我还找到了this page,我怀疑它能回答这个问题;但这对初学者来说并没有太大帮助。

我想它应该看起来像这样:

<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 :(得分:2)

您可以通过以下方式使用提取器:

  • 定义可以从原始数据反序列化的结构。
  • 定义一个接受提取器的处理程序。对于您的情况,请将Form as Nikolay said与结构的type参数一起使用。
  • 注册此处理程序。

如果您看一下链接文档中的简单示例,您将看到如何描述这种处理程序。

这是更完整的一个:

定义结构

#[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);
})

这或多或少是the current master branch of actix-web的完整示例。我还使用状态来说明如何在处理程序中使用多个参数

答案 1 :(得分:0)

您需要Form提取器。 params: Form<LoginParams>