Выдает ошибку 422 при попытке отправить форму Rocket Rust - PullRequest
0 голосов

Я пытаюсь создать форму для создания сообщений (я еще не использую db) в 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, это дало бы еще одну ошибку.

Ответы [ 2 ]

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>
0 голосов
/ 04 мая 2020

Трудно понять, в чем именно заключается проблема, только из фрагментов кода. Я думаю, вы должны попытаться увидеть, какие именно данные получены вашим бэкэндом, и попытаться понять, почему они не анализируются реализацией codegen * 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
        // ...
    }
}
...