使用actix-web从HTML页面捕获GET和POST请求

时间:2019-07-16 19:21:23

标签: rust rust-actix actix-web

提交HTML表单时出现错误消息,以便在FORM中捕获所需的详细信息(我正在使用actix-web)。

提交表单时,出现此错误:

Content type error

使用的代码:

#[derive(Deserialize)]
struct FormData {
    paire: String,
}


fn showit(form: web::Form<FormData>) -> String {
    println!("Value to show: {}", form.paire);
    form.paire.clone()
}

....

.service(
  web::resource("/")
    .route(web::get().to(showit))
    .route(web::head().to(|| HttpResponse::MethodNotAllowed()))
))

使用的HTML表单:

<form action="http://127.0.0.1:8080/" method="get">
<input type="text" name="paire" value="Example of value to show">
<input type="submit">

预期结果将是:

  

要显示的值示例

2 个答案:

答案 0 :(得分:0)

mentioned in code comments in the documentation一样,FormData反序列化仅适用于Post / x-www-form-urlencoded请求(目前):

/// extract form data using serde
/// this handler gets called only if the content type is *x-www-form-urlencoded*
/// and the content of the request could be deserialized to a `FormData` struct
fn index(form: web::Form<FormData>) -> Result<String> {
    Ok(format!("Welcome {}!", form.username))
}

因此,您有两种解决方案:

1)将您的表单更改为post / x-www-form-urlencoded。在您的示例中这很容易,但是在实际应用中并非总是如此

2)使用另一种形式的数据提取(还有其他几种提取器)

答案 1 :(得分:0)

我也遇到了这个问题,并通过将web::Form更改为web::Query来解决了这个问题。

#[derive(Deserialize)]
struct FormData {
    username: String,
}

fn get_user_detail_as_plaintext(form: web::Query<FormData>) -> Result<String> {
    Ok(format!("User: {}!", form.username))
}