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

标签 rust rust-actix

为了支持application/jsonmultipart/form-data在同一个 URL 上,我想检查“Content-Type” header 并选择合适的 Data<T>输入要提交给 .data App::new的功能.

如果我取消注释 .guard线,然后 curl -X POST -H "Content-Type: multipart/form-data" -F files=\"qqq\" localhost:8080/upload被丢弃。但是没有 .guard线路一切正常。怎么了?

HttpServer::new(move || {
    App::new()
        .service(resource("/upload")
     // .guard(actix_web::guard::Header("Content-Type", "multipart/form-data"))
        .data(form.clone())
        .route(post()
        .to(upload_multipart)
        )   
    )
})

如何在一个App实例中正确加入它们?

最佳答案

目前,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特质。

关于rust - 如何使用actix_web::guard::Header?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951776/

相关文章:

rust - 如何反序列化 Actix Actor 中的消息?

rust - 如何在 Actix 2.0 中从请求中获取 Cookie

rust - 返回响应后,在后台运行长时间运行的异步函数

rust - 如何从另一个特征对象创建特征对象?

lambda - 为什么这个闭包需要内联或 `dyn` ? `dyn` 在这里做什么?

database - 随着记录的增长,mongoldb文档更新的性能下降

json - 如何使用 Actix-Web 从同一请求中提取路径参数并解析 JSON 正文

rust - 如何定义函数类型参数(或其关联类型)的函数局部类型别名?

reference - 如何避免在 Rust 中克隆一个大整数

rust - 如何修复 Rust 中的资源暂时不可用错误?