如何使用actix_web :: guard :: Header?

时间:2019-07-09 11:41:06

标签: rust rust-actix

为了在同一URL上支持application/jsonmultipart/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实例中正确加入他们?

1 个答案:

答案 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特性。