超级无法找到服务器模块。

8
我正在使用Hyper编写一个“hello world” HTTP服务器,但是在尝试导入Serverrt模块时,我无法找到它们。当调用cargo run时,我会看到以下错误消息:
26 |     let server = hyper::Server::bind(&addr).serve(router);
   |                         ^^^^^^ could not find `Server` in `hyper`

我对 Rust 和 Hyper 感到困惑,可能是我忽略了一些显而易见的点。我想要编写一个仅包含 HTTP 层和一些基本路由的尽可能简洁/简单的东西,并且希望尽可能少地包含第三方依赖项,例如避免使用 Tokio,因为我认为它涉及异步行为,但是由于我是 Rust 新手,所以不确定上下文。
看起来我必须使用 futures,所以我包含了这个依赖项,也许 futures 只能与 async 保留字一起工作(我不确定它是来自 Tokio 还是 Rust 自身)。
令我困惑的是,在 Hyper 的示例中,我看到像 use hyper::{Body, Request, Response, Server}; 这样的导入,所以那个 Server 必须在某个地方。
这些是 Cargo.toml 中的依赖项:
hyper = "0.14.12"
serde_json = "1.0.67"
futures = "0.3.17"

以下是 main.rs 中的代码:

use futures::future;
use hyper::service::service_fn;
use hyper::{Body, Method, Response, StatusCode};
use serde_json::json;

fn main() {
    let router = || {
        service_fn(|req| match (req.method(), req.uri().path()) {
            (&Method::GET, "/foo") => {
                let mut 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 = hyper::Server::bind(&addr).serve(router); // <== this line fails to compile
    // hyper::rt::run(server.map_err(|e| {
    //     eprintln!("server error: {}", e);
    // }));
}

我该如何使上面的代码编译并运行?

hyper::server::Server??https://docs.rs/hyper/0.14.12/hyper/server/index.html - Netwave
1个回答

5
根据文档,在你的调用hyper::server::Server中缺少一个模块命名空间。
let server = hyper::server::Server::bind(&addr).serve(router)

为了使用 server ,您需要在cargo中激活特性标志
hyper = { version = "0.14.12", features = ["server"] }

hyper 中找不到 server。奇怪。我是否应该包含任何隐藏的依赖关系 - hyper =“0.14.12” 是否足够? - TPPZ
1
好的,现在编译器显示“在'server'中找不到'Server'”。不知道发生了什么:( - TPPZ
1
bind 支持 (crate features http1 或 http2) 和 crate feature tcp only。请将它们添加到功能标志中。 - Jmb
尽管文档中缺少一些内容:整个“Server”结构仅在功能“tcp”上可用,但文档中没有提到。 - Jmb
2
必须将它们全部添加:hyper = { version = "0.14.12", features = ["http1", "server", "tcp"] }。但是现在有一个问题,即“路由器”没有实现Trait或其他内容,但我还没有看到任何文档或示例提供比我上面写的更复杂的路由器:“对于<'a> Service<&'a AddrStream>的Trait未为[closure@src/main.rs:7:18: 23:6]`实现”。 - TPPZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接