转换 web::Json<T> 到 &mut T

Convert web::Json<T> to &mut T

提问人:Rusty 提问时间:3/31/2023 更新时间:3/31/2023 访问量:73

问:

我正在尝试编写一个简单的 api 来创建用户,但我需要像在方法中一样传递对象,因为它需要在后台进行编辑 - 以便添加 id、创建日期等。actix-webUsermutable referencedb_connector.create_user()

#[post("/users")]
pub async fn create_user(
    db_connector: web::Data<DBConnector>,
    user: web::Json<User>,
) -> impl Responder {
    match db_connector.create_user(&user.into_inner()).await {
        Ok(_) => HttpResponse::Created().finish(),
        Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
    }
}

但我不确定如何转换为.提前感谢您的帮助。web::Json<User>&mut User

可变 actix-web

评论

0赞 Matthew Trent 3/31/2023
你能创建一个你声明为可变的克隆吗?比如,如果你的结构是可克隆的,那就去吧()?let new_mutable_user: &mut User = user.clone()User#[derive(Clone)]
0赞 Cerberus 3/31/2023
你真的需要而不是拥有吗?也就是说,是否需要在调用后保留所有权?&mut UserUsercreate_user

答:

2赞 Masklinn 3/31/2023 #1
#[post("/users")]
pub async fn create_user(
    db_connector: web::Data<DBConnector>,
    web::Json(mut user): web::Json<User>,
) -> impl Responder {
    match db_connector.create_user(&mut user).await {
        Ok(_) => HttpResponse::Created().finish(),
        Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
    }
}

应该可以正常工作,尽管我没有测试它(并且不知道actix)。

根据文档,Json

pub struct Json<T>(pub T)

因此,它是一个简单的包装器,您可以在其上进行模式匹配,并且您只需要有一个可变绑定即可从中创建可变引用。

或者,如果出于某种原因想要保留现有的绑定样式,

#[post("/users")]
pub async fn create_user(
    db_connector: web::Data<DBConnector>,
    mut user: web::Json<User>,
) -> impl Responder {
    match db_connector.create_user(&mut user.0).await {
        Ok(_) => HttpResponse::Created().finish(),
        Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
    }
}

同样的交易,只是没有对输入 Json 进行基于模式的解构。

地狱,即使只是

#[post("/users")]
pub async fn create_user(
    db_connector: web::Data<DBConnector>,
    user: web::Json<User>,
) -> impl Responder {
    match db_connector.create_user(&mut user.into_inner()).await {
        Ok(_) => HttpResponse::Created().finish(),
        Err(e) => HttpResponse::InternalServerError().body(e.to_string()),
    }
}

可能有效。

评论

1赞 Rusty 3/31/2023
谢谢@Masklinn。第二种选择有效。我发现做同样事情的另一种方法是.user.into_inner().borrow_mut()