1

我正在尝试制作一个表单来在 Rocket Rust 中创建帖子(我还没有访问数据库)。当我尝试提交表单时,我收到错误 422。

错误:

POST /new_post application/x-www-form-urlencoded:
    => Matched: POST /new_post (new_post_form)
    => Error: The incoming form failed to parse.
    => Outcome: Failure
    => Warning: Responding with 422 Unprocessable Entity catcher.
    => Response succeeded.

处理程序代码:

#[post("/new_post", data="<form>")]
fn new_post_form(form: Form<NewPostForm>) -> Flash<Redirect>  {
    let form = form.into_inner();
    if form.body.is_empty() {
        Flash::error(Redirect::to("/new_post"), "NoBodyError");
    }
    if form.name.is_empty() {
        Flash::error(Redirect::to("/new_post"), "NoNameError");
    }
    if form.name.is_empty() && form.body.is_empty() {
        Flash::error(Redirect::to("/new_post"), "NoNameBodyError")
    } else {
        Flash::error(Redirect::to("/new_post"), "NoNameBodyError")
    }
}

表单结构:

#[derive(FromForm)]
pub struct NewPostForm {
    pub name: String,
    pub body: String
}

HTML 表单:

<form action="/new_post" method="post">
  name:<input type="text" name="name" id="name">
  Body:<input type="text" name="body" id="body">
  <button type="submit" name="button"></button>
</form>

PS 我认为问题出在 HTML 表单中,而不是 Rust。如果问题出在 Rust 中,它会给出另一个错误。

4

2 回答 2

1

仅从代码片段很难理解这里到底是什么问题。我认为您应该尝试查看后端接收到的确切数据,并尝试了解为什么它没有被代码生成的FromForm实现解析。

您实际上可以FromForm自己实现该特征。只需删除#[derive(FromForm)]并执行以下操作:

impl<'f> FromForm<'f> for NewPostForm {
    type Error = ();

    fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result<NewPostForm, ()> {
        // Inspect `items` here
        // ...
    }
}
于 2020-05-04T09:38:49.877 回答
0

问题出在 HTML 格式中。当我删除name="button"时,表格开始工作。

更新表格:

<form action="/new_post" method="post">
  name:<input type="text" name="name" id="name">
  Body:<input type="text" name="body" id="body">
  <button type="submit"></button>
</form>
于 2020-05-07T13:53:12.727 回答