提问人:Rusty 提问时间:3/31/2023 更新时间:3/31/2023 访问量:73
转换 web::Json<T> 到 &mut T
Convert web::Json<T> to &mut T
问:
我正在尝试编写一个简单的 api 来创建用户,但我需要像在方法中一样传递对象,因为它需要在后台进行编辑 - 以便添加 id、创建日期等。actix-web
User
mutable reference
db_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
答:
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)。
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()
评论
let new_mutable_user: &mut User = user.clone()
User
#[derive(Clone)]
&mut User
User
create_user