我正在使用Rocket框架,我想在我的处理程序中发出异步HTTP请求,类似于
#[get("/")]
async fn handler() -> String {
some_func().await;
"OK".into()
}
结果,我得到了下一个错误
the trait `rocket::response::Responder<'_>` is not implemented for `impl core::future::future::Future`
我试图编写实现,但失败了。有没有一种方法可以实现impl trait的trait?
或者可以指定async fn的返回类型,这样我就可以返回实现了必要特征的自定义类型?
在Rocket 0.5.0发布之前,您必须使用异步路由的开发版本。值得注意的是,这也意味着您可以使用稳定的Rust进行编译。
在您的Cargo.toml 中
rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }
一旦使用了开发版本,您就可以像在问题中那样编写异步路由。
请注意,各种API可能不同。看见https://api.rocket.rs/master/rocket/index.html以获取开发版本的文档。
从Rocket v0.4开始,仍然无法描述使用异步函数的处理程序,尽管Rocket计划在未来迁移到完全异步环境(请参阅问题#1065(。
在完成迁移之前,人们无法有效地处理火箭的未来。解决方法可能包括添加您自己的执行器,并在处理程序中出现的未来完成时进行阻塞(这肯定不会从异步中获得尽可能多的好处(。
截至2022年,这很简单:
Rocket使在路由中使用async/await变得容易。
use rocket::tokio::time::{sleep, Duration}; #[get("/delay/<seconds>")] async fn delay(seconds: u64) -> String { sleep(Duration::from_secs(seconds)).await; format!("Waited for {} seconds", seconds) }