【问题标题】:How do I get the parameters from a POST request from a HTML form in Actix-web?如何从 Actix-web 中 HTML 表单的 POST 请求中获取参数?
【发布时间】:2018-07-04 21:11:46
【问题描述】:

我正在 Actix-web 中构建一个小 webapp,但我找不到任何从 Actix-web 中的 POST 请求中获取参数的示例。

Searching their excellent examples repo 仅给出(对我而言)有意义的examplescouple,但它们都处理 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
}

【问题讨论】:

    标签: rust rust-actix


    【解决方案1】:

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

    • 定义可以从原始数据反序列化的结构。
    • 定义一个接受提取器的处理程序。在您的情况下,使用 Form as Nikolay said 和结构的类型参数。
    • 注册此处理程序。

    如果您查看链接文档中的简单示例,您将了解如何描述此类处理程序。

    这里有一个更完整的:

    定义结构

    #[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 的完整示例。我还使用 state 来展示如何在处理程序中使用多个参数

    【讨论】:

      【解决方案2】:

      您需要Form 提取器。 params: Form&lt;LoginParams&gt;

      【讨论】:

      • 这可能会回答这个问题,但如果evidence 支持它会更有帮助。
      • 我正在阅读它,似乎它确实是答案,我几乎理解那里的示例。我只是不明白它应该如何访问req 参数(如我上面的示例),当它只获得Form
      • 我现在放弃并继续做其他事情,直到github.com/actix/examples/issues/24 得到解决
      猜你喜欢
      • 2019-11-25
      • 2020-10-21
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2020-04-03
      • 2017-03-08
      相关资源
      最近更新 更多