Rust 如何根据火箭服务器的状态使用不同的值进行响应?

Rust 如何根据火箭服务器的状态使用不同的值进行响应?,rust,rust-rocket,Rust,Rust Rocket,我想根据服务器的状态,用不同的值响应“相同的请求” 我的期望是,这些反应将以循环的方式发生: 有人发送了一个GET/请求,它的响应是“你好,世界!” 然后他们发送一个GET/请求,它会以“Hello,Rust!”作为响应 然后他们发送一个GET/请求,它会以“你好,火箭!”作为响应 然后他们发送一个GET/请求,它会以“Hello,State!”作为响应 我不想使用在main中初始化的变量(在火箭路径处理程序中)。我想使用一个变量,它的值可以在main中更改(在火箭路径处理程序中) 这段代码

我想根据服务器的状态,用不同的值响应“相同的请求”

我的期望是,这些反应将以循环的方式发生:

  • 有人发送了一个
    GET/
    请求,它的响应是“你好,世界!”
  • 然后他们发送一个
    GET/
    请求,它会以“Hello,Rust!”作为响应
  • 然后他们发送一个
    GET/
    请求,它会以“你好,火箭!”作为响应
  • 然后他们发送一个
    GET/
    请求,它会以“Hello,State!”作为响应
我不想使用在main中初始化的变量(在火箭路径处理程序中)。我想使用一个变量,它的值可以在main中更改(在火箭路径处理程序中)

这段代码编译时没有错误,但实际行为是它总是响应“Hello,World!”

#![功能(过程宏观卫生)]
#![功能(decl_宏)]
#[宏_使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱(静态);
使用std::sync::{Arc,Mutex};
使用火箭::状态;
使用std::线程;
使用std::time::Duration;
懒惰的人!{
静态参考响应:Arc
=Arc::new(Mutex::new(字符串::from(“你好,世界!”));
}
#[获取(“/”)]
fn get_响应(状态:state)->字符串{
let response=state.lock().unwrap();
让ret:String=String::from(response.as_str());
ret
}
fn main(){
let managed_response:Arc=response.clone();
火箭:点火
.manage(管理的_响应)
.mount(“/”,routes![获取响应])
.launch();
让mut server_state=0;
环路{
//服务器状态的伪转换
线程::睡眠(持续时间::从秒(5));
让mut response=response.lock().unwrap();
匹配服务器\u状态{
0=>*response=String::from(“Hello,Rust!”),//状态0
1=>*response=String::from(“你好,火箭!”),//状态1
2=>*response=String::from(“你好,状态!”),//状态2
_=>恐慌!(),
}
服务器状态+=1;
如果服务器状态>=3{
服务器状态=0;
}
}
}

通过反复试验,我自己解决了这个问题。 这是代码。 如果你有其他更好的解决方案,我希望你能教我

#![功能(过程宏观卫生)]
#![功能(decl_宏)]
#[宏_使用]
外部板条箱火箭;
#[宏_使用]
外部板条箱(静态);
使用std::sync::{Arc,Mutex};
使用std::线程;
使用std::time::Duration;
懒惰的人!{
静态引用响应:Arc=Arc::new(Mutex::new(String::from(“Hello,World!”));
}
#[获取(“/”)]
fn get_response()->字符串{
让response=response.lock().unwrap();
让ret:String=String::from(response.as_str());
ret
}
fn主_代码(){
让mut server_state=0;
环路{
线程::睡眠(持续时间::从秒(5));
让mut response=response.lock().unwrap();
匹配服务器\u状态{
0=>*response=String::from(“Hello,Rust!”),
1=>*response=String::from(“你好,火箭!”),
2=>*response=String::from(“你好,状态!”),
_=>恐慌!(),
}
服务器状态+=1;
如果服务器状态>=3{
服务器状态=0;
}
}
}
fn main(){
让handle=thread::spawn(| |{
主_代码();
});
火箭:点火
.mount(“/”,routes![获取响应])
.launch();
}

欢迎使用堆栈溢出!看起来你的问题可能会由你的答案来回答。你也可能对这一点感兴趣。如果没有,请回答您的问题以解释差异。否则,我们可以将这个问题标记为已回答。有很多事情你不想做。如果您继续放弃解决方案,而没有合理的技术原因来解释这些解决方案不适用的原因,您将很难解决编程问题。您是指使用全局变量的解决方案吗?您的问题要求根据一系列请求更改响应。但是,您的代码会根据thread::sleep()调用修改响应。换句话说,发出请求的第一个人很可能看不到第一条消息。在请求处理中修改要发送的消息,而不是在定时线程中,不是更好吗?谢谢您的评论。抱歉,单词选择不合适。我不想根据一系列请求更改响应。我想根据服务器的状态进行更改。