为了在同一URL上支持application/json
和multipart/form-data
,我想检查“ Content-Type”标头并选择适当的Data<T>
类型以将.data
的{{1}}功能。
如果我取消对App::new
行的注释,则会删除.guard
。但是如果没有curl -X POST -H "Content-Type: multipart/form-data" -F files=\"qqq\" localhost:8080/upload
行,一切都会按预期进行。怎么了?
.guard
如何在一个App实例中正确加入他们?
答案 0 :(得分:0)
当前,actix-web 1.0.3 does not support 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
特性。