Поймать 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))
}