尝试获取完整的请求URI(scheme + authority + path)
我找到了讨论:https://github.com/tokio-rs/axum/discussions/1149,它说Request.uri()应该有它。所以我尝试了以下方法:
use axum::body::Body;
use axum::http::Request;
use axum::routing::get;
use axum::Router;
async fn handler(req: Request<Body>) -> &'static str {
println!("The request is: {}", req.uri());
println!("The request is: {}", req.uri().scheme_str().unwrap());
println!("The request is: {}", req.uri().authority().unwrap());
"Hello world"
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/test", get(handler));
axum::Server::bind(&"0.0.0.0:8080".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}
运行curl -v "http://localhost:8080/test"
,得到:
The request is: /test
thread 'tokio-runtime-worker' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:8:59
它似乎只包含路径。
我还发现了另一个问题:https://github.com/tokio-rs/axum/discussions/858,这表明axum::http::Uri
应该能够提取所有细节,但我遇到了同样的问题:
use axum::http::Uri;
use axum::routing::get;
use axum::Router;
async fn handler(uri: Uri) -> &'static str {
println!("The request is: {}", uri);
println!("The request is: {}", uri.scheme_str().unwrap());
println!("The request is: {}", uri.authority().unwrap());
"Hello world"
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/test", get(handler));
axum::Server::bind(&"0.0.0.0:8080".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}
curl -v "http://localhost:8080/test"
The request is: /test
thread 'tokio-runtime-worker' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:7:53
> cargo -V
cargo 1.68.0-nightly (2381cbdb4 2022-12-23)
> rustc --version
rustc 1.68.0-nightly (ad8ae0504 2022-12-29)
Cargo.toml
[package]
name = "axum_test"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.6.10"
tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] }
1条答案
按热度按时间tf7tbtn21#
Request
中的Uri
仅提供path
。你可以使用Host extractor
: