You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:15:04