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

Apache-2.0

47KB
621

shs (简单HTTP服务器)

此工具已不再积极开发。如果您有兴趣接管或重新使用crates.io上的名称,请随时联系我: [email protected]

crates.io Documentation

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-webwarp。但有时这种速度是以易用性为代价的,对于某些项目来说,牺牲一些性能是有意义的。例如,您可能知道服务器只会在内部网络中使用,并且连接到服务器的客户端数量有限。

此库与更快的服务器库的主要区别可能在于它不使用异步。相反,为每个连接创建一个新线程。这以几种方式帮助提高易用性。首先,您不必担心意外阻塞异步运行时。您可以阻塞线程任意长的时间,而不会干扰其他线程,除非存在锁定错误。(查找锁比查找阻塞异步函数要容易。)其次,异步代码“感染”一切;您使用 std::fs 的任何地方都需要切换到使用 tokio::fs,许多函数需要添加 asyncawait,等等。第三,稳定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