rust - 如何从 Actix-web 中 HTML 表单的 POST 请求中获取参数?
问题描述
我正在 Actix-web 中构建一个小 webapp,但我找不到任何从 Actix-web 中的 POST 请求中获取参数的示例。
搜索他们的优秀示例 repo只提供了几个(对我而言)有意义的示例,但它们都处理 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
}
解决方案
您可以通过以下方式使用提取器:
- 定义一个可以从原始数据反序列化的结构。
- 定义一个接受提取器的处理程序。在您的情况下,使用
Form
Nikolay 所说的,使用您的结构的类型参数。 - 注册此处理程序。
如果您查看链接文档中的简单示例,您将了解如何描述此类处理程序。
这是一个更完整的:
定义结构
#[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);
})
这或多或少是当前 master 分支的actix-web
完整示例。我还使用 state 来展示如何在处理程序中使用多个参数
推荐阅读
- javascript - Div 在聊天中没有溢出
- c++ - 使用“new []”分配和仅使用“delete”删除会发生什么
- python - 分隔数组中的每个项目
- typescript - 为什么打字稿函数参数类型推断失败?
- guptateamdeveloper - 使用 Gupta.Sql.Base.dll 和一些与连接相关的问题 SQLBase901 设置我的连接时出现查询错误
- flutter - 重叠两个按钮 Flutter
- crystal-reports - 无法在第三方软件的内置 Crystal Report Viewer 中显示动态参数
- arrays - 使用 VBA 将数组粘贴到 Excel 中的空白表时遇到问题
- python - Pandas sort_values,排序列中的重复值
- flutter - 如何使用颤振获取所有键:值保存在共享首选项中?