如何使用 rust-rocket 将数据传递到端点

问题描述 投票:0回答:1

我有一个名为 main.rs 的文件和一个名为 Rocket.rs 的文件。第一个用于发射另一个文件中定义的火箭:

main.rs

#[tokio::main]
async fn main(){
    let rocket = rocket();
    rocket.launch().await;
}

另一个具有火箭功能,并使用 Tera 模板将信息传递到 HTML。

rocket.rs

#[get("/end_point_example")]
fn end_point_example() -> Template {
    let context: HashMap<&str, &str> = [("data1", "value1"), ("data2","value1")]
        .iter().cloned().collect();
    Template::render("end_point_example", &context)
}

#[launch]
pub fn rocket() ->_ {
    rocket::build()
        .mount("/static", FileServer::from("static"))
        .mount("/", routes![end_point_example])
        .attach(Template::fairing())
}

这工作得很好,但问题是我在主文件中有端点的上下文值(在本例中为 value1 和 value2)。如何将它们从 main.rs 传递到 Rocket.rs 中的端点?

我见过这种方法使用了

manage()
方法:

use std::sync::atomic::AtomicUsize;

struct HitCount {
    count: AtomicUsize
}

#[launch]
pub fn rocket() ->_ {
    rocket::build()
        .manage(HitCount { count: AtomicUsize::new(0) });
        .mount("/static", FileServer::from("static"))
        .mount("/", routes![end_point_example])
        .attach(Template::fairing())
}

#[get("/count")]
fn count(hit_count: &State<HitCount>) -> String {
    let current_count = hit_count.count.load(Ordering::Relaxed);
    format!("Number of visits: {}", current_count)
}

问题是构建和管理命令应该应用在 Rocket.rs 文件中,所以它没有帮助。你有什么建议吗?

(注意:考虑到显然我不需要

value1
value2
动态更改。一旦我在主体中评估它们,它们在整个运行过程中保持不变。)

rust web-frameworks rust-rocket tera
1个回答
0
投票

在 Rocket.rs 文件中的 build() 之后不强制使用 manage() 函数,此解决方案工作正常:

main.rs

struct MyData {
    data: usize,
}

#[tokio::main]
async fn main(){
    let data =  MyData{data:12};
    let rocket = rocket().manage(data);
    rocket.launch().await;
 }

rocket.rs

#[get("/end_point")]
fn end_point(state: &State<MyData>) -> Template {
    let context: HashMap<&str, String> = [("data", 
               state.data.to_string())]
        .iter().cloned().collect();
Template::render("end_point", &context)
}

#[launch]
pub fn rocket() ->_ {
    rocket::build()
        .mount("/static", FileServer::from("static"))
        .mount("/", routes![end_point])
        .attach(Template::fairing())
 }
© www.soinside.com 2019 - 2024. All rights reserved.