Hyper v1.0.1中Server模块无法导入的问题求助
解决Hyper v1.0.1中Server导入错误的问题
问题原因
Hyper 1.0版本对模块结构进行了重构,Server不再位于hyper::server子模块下,而是直接放在Hyper的根命名空间中,因此你之前的导入路径hyper::server::Server会触发"no Server in server"的错误。
解决方案
有两种可行的修复方式:
方式1:修正Hyper Server的导入路径
将原导入语句:
use hyper::server::Server;
替换为:
use hyper::Server;
修改后启动代码可保持不变:
Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap();
方式2:使用Axum自带的启动方法(推荐)
Axum作为基于Hyper的Web框架,提供了更简洁的服务启动API,无需直接导入Hyper的Server。你可以直接调用Router的绑定方法,或导入Axum封装的Server:
// 方式2.1:直接用Router的bind方法 app.bind(addr) .await .unwrap(); // 方式2.2:导入Axum的Server use axum::Server; Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap();
这种方式更贴合Axum的使用习惯,不需要额外依赖Hyper的底层API。
修改后的完整main.rs示例(方式2)
use axum::{ extract::Form, response::{Html, Redirect}, routing::{get, post}, Router, Extension, Server, // 直接从axum导入Server }; use serde::Deserialize; use std::net::SocketAddr; use tera::{Context, Tera}; #[derive(Deserialize)] struct CreateDagForm { dag_name: String, schedule: String, } async fn show_base(Extension(tera): Extension<Tera>) -> Html<String> { let rendered = tera.render("base.html", &Context::new()).unwrap(); Html(rendered) } async fn create_dag(Form(form): Form<CreateDagForm>) -> Redirect { println!("Received DAG: Name = {}, Schedule = {}", form.dag_name, form.schedule); Redirect::to("/") } #[tokio::main] async fn main() { let tera = Tera::new("templates/**/*").expect("Failed to initialize Tera"); let app = Router::new() .route("/", get(show_base)) .route("/create_dag", post(create_dag)) .layer(Extension(tera)); let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); println!("Server running at http://{}", addr); Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); }
依赖配置验证
你的Hyper依赖配置已开启full特性,版本^1.0.1符合要求,无需修改:
hyper = { version = "^1.0.1", features = ["full"]}
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

