我開始學習 Rust 和火箭框架https://crates.io/crates/rocket。
我有一個愚蠢的問題,我無法弄清楚。
呼叫 GET /universe/ports/21 時,如何回傳我在 main() 的第一行創建的 my_universe?
fn main() {
let my_universe = universe::model::Universe::new();
rocket::ignite().mount("/universe", routes![ports]).launch();
}
#[get("/ports/<id>")]
fn ports(id: u16) -> universe::model::Universe {
// need to return my_universe here
}
我遇到的問題是,如果我在路由控制器 ports() 中定義 my_universe,它將在每個請求上重新創建 my_universe 物件。相反,我需要路由在每個請求上回傳相同的 my_universe 物件
uj5u.com熱心網友回復:
在 Rocket 中共享非可變狀態相當容易。您可以manage在火箭構建期間添加狀態。
rocket::build()
.manage(my_universe) // put the shared state here
.mount("/universe", routes![ports])
如果您想在路線中回傳此狀態,則必須將其添加serde為依賴項和Rocketjson的功能。
[dependencies]
rocket = { version = "0.5.0-rc.2", features = ["json"]}
serde = "1.0.147"
您現在可以注釋您的struct,Serialize以便我們稍后將其作為 JSON 回應發送。
#[derive(Serialize)]
struct Universe {
/* ... */
}
并使用引數在您的路線中訪問此狀態&State。
#[get("/ports/<id>")]
fn ports(id: u16, universe: &State<Universe>) -> Json<&Universe> {
Json(universe.inner())
}
在這里,我們可以訪問inner狀態的值并將其回傳為Json.
到目前為止,狀態是不可變的,并且不能在可能不是您想要的路由中更改。考慮將您的狀態包裝成 aMutex以允許內部可變性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/528153.html
標籤:api休息锈火箭
