我试图在axum
中使用HTPP/2
,但我无法访问它,无论是用我的浏览器还是用httpie。我已经检查了axum
和hyper
的文档,由于我的英语和编程技能很差,我在网上没有找到任何信息,我希望在这里得到一些帮助
// src/main.rs
#[tokio::main]
async fn main() {
let app = axum::Router::new().route("/", axum::routing::get(|| async {"Hello, World!"}));
let addr = std::net::SocketAddr::from(([127,0,0,1], 8080));
let _server = axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();
}
# Cargo.toml
[dependencies.axum]
version = "0.6"
default-features = false
features = ["http2", "tokio", "matched-path"]
C:Usersuser>http :8080
http: error: ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000002843AB5D670>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。')) while doing a GET request to URL: http://localhost:8080/
当http1
和http2
同时使能时,访问正常,但默认使用http1
,当http2_only(true)
使能时,访问不正常。
正如GitHub上的讨论所暗示的那样,许多客户端将使用HTTP 1执行初始请求,但使用Upgrade
标头来传达他们升级到HTTP 2的愿望。不支持HTTP 2的服务器将忽略报头,数据交换将继续使用HTTP 1,但支持HTTP 2的服务器将回复101 Switching Protocols
响应,然后客户端和服务器将继续使用HTTP 2。
如果在服务器中不包含HTTP 1支持,则不能使用此升级机制,并且客户端必须使用HTTP 2进行初始请求。然而,这与HTTP 1服务器是向后不兼容的,所以除非使用某种设置或标志显式请求,否则通常不会这样做。您需要检查您正在使用的HTTP客户端的文档,看看它是否有可以使用HTTP 2进行初始请求的设置。