如何在Rust Rocket框架中修复POST请求中的解析错误

时间:2019-05-19 02:30:49

标签: post web-applications rust-rocket

我正在使用rust Rocket框架制作一个非常简单的Web应用程序。我有一个非常简单的HTML文件,其格式如下:

<form action="/search" method="post" accept-charset="utf-8">
  Search Term:<input type="text" name="searchterm">
  <input type="submit" value="search">
</form>

接下来,这是我用来处理请求的火箭功能。我有一个get函数,当访问“ /”时会弹出index.html,对于我的表单,我有以下函数:

#[derive(FromForm)]
pub struct Request<'r> {
  payload: &'r RawStr,
  //we can add more if we want later on, for other form options...
}

#[post("/search", data = "<data>")]
pub fn process(data: Form<Request>) -> Result<Redirect, String> {
  if data.payload == "Hello!" {
    Ok(Redirect::to("/search/Hello"))
  } else {
    Err(format!("Unknown search term, '{}'.", data.payload))
  }
}

然后,这是对GET请求的响应:

#[get("/search/<term>")]
pub fn response(term: &RawStr) -> String {
  format!("You typed in {}.", term)
}

就像我说的那样,非常简单,非常准,只是试图同时踩入Rust和Web Apps。我在这两个方面都没有太多经验。我的问题是,使用我的html文件中呈现给用户的字段时,服务器返回错误:

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

如果我直接进入“本地主机:8000 / search / Hello!”我可以看到我的GET响应有效。但是,如果我使用表格,它将拒绝解析。我究竟做错了什么?我只是试图制作一个接受输入的Web应用程序,然后根据该输入返回一些信息。网站重定向,网页抓取,我还不确定功能的具体细节,但是我需要能够在表单中输入一些内容,并稍后将其用于我的rust代码中。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我认为问题在于您的表单参数名称(<input type="text" name="searchterm">)与结构字段名称(payload)不匹配。如果您将一个或另一个重命名为匹配名称,则您的表单应该可以使用。