5个版本 (3个重大变更)
0.4.2 | 2024年3月17日 |
---|---|
0.4.0 | 2020年7月12日 |
0.3.0 | 2020年7月7日 |
0.2.0 | 2020年7月6日 |
0.1.0 | 2020年7月6日 |
在 #req 中排名第 9
47KB
621 行
shs (简单HTTP服务器)
此工具已不再积极开发。如果您有兴趣接管或重新使用crates.io上的名称,请随时联系我: [email protected]
shs包提供易于使用的非异步HTTP服务器。
示例
use anyhow::Error;
use fehler::throws;
use serde::Serialize;
use shs::{Request, Server};
#[derive(Serialize)]
struct Resp {
name: String,
}
#[throws]
fn handler(req: &mut Request) {
req.write_json(&Resp {
name: "hello".into(),
})?;
}
#[throws]
fn main() {
simple_logging::log_to_stderr(log::LevelFilter::Info);
let mut server = Server::new("127.0.0.1:1234")?;
server.route("GET /hello", &handler)?;
server.launch()?;
}
设计目标
Rust生态系统已经拥有一些优秀的HTTP服务器库,这些库试图尽可能快,例如 actix-web 和 warp。但有时这种速度是以易用性为代价的,对于某些项目来说,牺牲一些性能是有意义的。例如,您可能知道服务器只会在内部网络中使用,并且连接到服务器的客户端数量有限。
此库与更快的服务器库的主要区别可能在于它不使用异步。相反,为每个连接创建一个新线程。这以几种方式帮助提高易用性。首先,您不必担心意外阻塞异步运行时。您可以阻塞线程任意长的时间,而不会干扰其他线程,除非存在锁定错误。(查找锁比查找阻塞异步函数要容易。)其次,异步代码“感染”一切;您使用 std::fs
的任何地方都需要切换到使用 tokio::fs
,许多函数需要添加 async
和 await
,等等。第三,稳定Rust中的异步生态系统仍然相当新颖。目前存在一些难题,如tokio/async-std分裂、缺乏查找意外异步阻塞代码的工具,以及偶尔出现的疯狂编译错误。我完全预计异步生态系统在未来几年内将得到很大改善,这绝对不是对Rust实现异步方式的抱怨!它是一个伟大的技术成就,就像任何其他东西一样,它有自己的权衡。
与其他Rust HTTP服务器相比,它更“字符串化”。例如,路由是用字符串定义的,如 "GET /path/:param"
而不是像 router.get(Path::new("path").param("param"))
这样的方式。它效率较低,一些本应在编译时捕获的错误将在运行时捕获,但编写起来更快,更重要的是,更易于阅读。
安全性
此crate没有直接使用任何 unsafe
代码,尽管它所依赖的库可能使用。
依赖项
~2.8–3.5MB
~104K SLoC