Rust使用Hyper开发HTTP服务器时找不到Server模块如何解决?
问题根因
- Hyper 0.14 版本默认不会开启服务端相关功能,
Server、rt模块都被拆分到了可选feature中,需要手动启用才能导入使用 async是Rust 1.39版本后就稳定的原生语法特性,和Tokio无关,Tokio只是异步代码的运行时实现。Hyper 0.14的服务端组件底层默认绑定Tokio作为运行时,使用该版本必然会引入Tokio依赖,如果你完全不想接触异步逻辑,可以选择降级到0.12及之前的同步版本Hyper,或者更换同步HTTP库如tiny-http。
修复步骤
1. 修改Cargo.toml依赖配置
启用Hyper的服务端、TCP绑定、运行时相关feature:
hyper = { version = "0.14.12", features = ["server", "tcp", "rt"] } serde_json = "1.0.67" futures = "0.3.17"
2. 调整main.rs代码
补全导入,放开运行时代码即可:
use futures::future; use hyper::service::service_fn; use hyper::{Body, Method, Response, StatusCode, Server}; use serde_json::json; fn main() { let router = || { service_fn(|req| match (req.method(), req.uri().path()) { (&Method::GET, "/foo") => { let res = Response::new( Body::from(json!({"message": "bar"}).to_string()) ); future::ok(res) }, (_, _) => { let mut res = Response::new( Body::from(json!({"content": "route not found"}).to_string()) ); *res.status_mut() = StatusCode::NOT_FOUND; future::ok(res) } }) }; let addr = "127.0.0.1:8080".parse::<std::net::SocketAddr>().unwrap(); let server = Server::bind(&addr).serve(router); hyper::rt::run(server.map_err(|e| { eprintln!("server error: {}", e); })); }
无异步依赖替代方案
如果你完全不想引入Tokio等异步运行时,可以使用同步HTTP库tiny-http实现相同功能,依赖更精简,逻辑完全和你现有需求对齐,无需处理异步相关概念。
内容的提问来源于stack exchange,提问作者TPPZ
相关产品推荐
相关产品推荐

