我正在开发我的第一个玩具项目,该项目包含一个带有Rocket框架的简单API。但我有一个非常基本的需求,我很想让你了解如何解决它
对于某些端点,我需要调用外部REST API,因此我使用reqwest
机箱来调用。我更喜欢异步调用,因为我希望我的API在该端点上有很多并发请求。
另一方面,我使用干净/六边形的体系结构指南来实现整个思想,然后我使用traits作为一种接口。这有助于测试和嘲笑。
它看起来怎么样:
pub trait DataFetcher {
fn fetch_data(path: String) -> Result<String, Box<dyn sts::error::Error>>,
}
pub struct DataProvider {
}
impl DataProvider {
pub fn new() -> Self {
// constructor here.
}
}
impl DataFetcher for DataProvider {
pub fetch_data(path: String) -> Result<String, Box<dyn std::error::Error>> {
// call to external REST API should be here.
}
}
问题来了:Rust 2018不支持异步特征方法。以下是我的猜测:
- 停止使用特征
- 使用Async_traits板条箱(实验(
- 其他
你有什么建议?你有一些我可以从中得到启发的例子吗?
async-trait
板条箱绝对不是实验性的。它是使用最广泛的板条箱之一,也是异步fns特性的标准解决方案。
然而,如果你不需要抽象,我不会使用特征。这只会使代码变得复杂。