我正在使用Hyper编写一个“hello world” HTTP服务器,但是在尝试导入
我对 Rust 和 Hyper 感到困惑,可能是我忽略了一些显而易见的点。我想要编写一个仅包含 HTTP 层和一些基本路由的尽可能简洁/简单的东西,并且希望尽可能少地包含第三方依赖项,例如避免使用 Tokio,因为我认为它涉及异步行为,但是由于我是 Rust 新手,所以不确定上下文。
看起来我必须使用 futures,所以我包含了这个依赖项,也许 futures 只能与 async 保留字一起工作(我不确定它是来自 Tokio 还是 Rust 自身)。
令我困惑的是,在 Hyper 的示例中,我看到像
这些是
我该如何使上面的代码编译并运行?
Server
和rt
模块时,我无法找到它们。当调用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