Поймать GET & POST запросы со страницы HTML, используя 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">

Ожидаемый результат будет:

Пример значения для отображения

1 ответ

Решение

Как упоминается в комментариях к коду в документации, десериализация 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) измените свою форму на пост / x-www-form-urlencoded. Это легко в вашем примере, но не всегда возможно в реальных приложениях

2) использовать другую форму извлечения данных (есть несколько других экстракторов)

У меня тоже была эта проблема, и я решил ее, изменив web::Form к web::Query.

  • За POSTзапросы, затем используйте web:: Form.
  • За GETзапросы, затем используйте 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))
}
Другие вопросы по тегам