В настоящее время actix-web 1.0.3 не поддерживает multipart / form-data , но вы можете использовать actix_multipart . Поскольку основное внимание уделяется десериализации одних и тех же данных с различными типами контента, я упростил использование application/x-www-form-urlencoded
.
Чтобы поддерживать два разных типа контента, вложите web::resource
и добавьте охрану для каждого из обработчиков:
web::resource("/")
.route(
web::post()
.guard(guard::Header(
"content-type",
"application/x-www-form-urlencoded",
))
.to(form_handler),
)
.route(
web::post()
.guard(guard::Header("content-type", "application/json"))
.to(json_handler),
),
Создание обработчиков, принимающих десериализованные данные, и отправка данных в общий обработчик:
fn form_handler(user: web::Form<User>) -> String {
handler(user.into_inner())
}
fn json_handler(user: web::Json<User>) -> String {
handler(user.into_inner())
}
fn handler(user: User) -> String {
format!("Got username: {}", user.username)
}
Результат:
$ curl -d 'username=adsf' localhost:8000
Got username: asdf⏎
$ curl -d '{"username": "asdf"}' localhost:8000
Parse error⏎
$ curl -d '{"username": "asdf"}' -H 'content-type: application/json' localhost:8000
Got username: asdf⏎
Чтобы создать собственный десериализатор, используйте черту FromRequest
.