fetch在发送a 之前,浏览器将发送一个请求方法OPTIONS来确认 API 将接受来自特定来源的脚本的请求。
Chrome 显示我的 Axum 服务器正在拒绝我客户端的 405 请求。我的路由器如下所示:
\nlet app = Router::new()\n .layer(TraceLayer::new_for_http())\n .layer(CorsLayer::permissive())\n .route("/api", post(server));\nRun Code Online (Sandbox Code Playgroud)\nRouter::layer表示所有到router的请求都会被layer\xe2\x80\x99s对应的中间件处理。但我不确定它是否发挥了作用。
\n我正在尝试向每个跟踪事件添加请求 ID。tower_http::trace我可以这样做:
#[derive(Clone)]
pub struct RequestSpan;
impl<B> tower_http::trace::MakeSpan<B> for RequestSpan {
fn make_span(&mut self, request: &http::Request<B>) -> tracing::Span {
tracing::error_span!(
"rq",
id = %ulid::Ulid::new().to_string(),
method = %request.method(),
uri = %request.uri(),
version = ?request.version(),
)
}
}
...
let middleware_stack = tower::ServiceBuilder::new()
.layer(TraceLayer::new_for_http().make_span_with(RequestSpan))
Run Code Online (Sandbox Code Playgroud)
它在服务器范围内工作,但我还需要将请求 ID 传递到外部任务队列中。有什么建议么?
我正在实现 tokio/axum HTTP 服务器。在运行服务器的函数中,我配置路由、添加共享应用程序服务并添加跟踪层。
我的跟踪配置如下所示:
let tracing_layer = TraceLayer::new_for_http()
.make_span_with(|_request: &Request<Body>| {
let request_id = Uuid::new_v4().to_string();
tracing::info_span!("http-request", %request_id)
})
.on_request(|request: &Request<Body>, _span: &Span| {
tracing::info!("request: {} {}", request.method(), request.uri().path())
})
.on_response(
|response: &Response<BoxBody>, latency: Duration, _span: &Span| {
tracing::info!("response: {} {:?}", response.status(), latency)
},
)
.on_failure(
|error: ServerErrorsFailureClass, _latency: Duration, _span: &Span| {
tracing::error!("error: {}", error)
},
);
let app = Router::new()
// routes
.layer(tracing_layer)
// other layers
...
Run Code Online (Sandbox Code Playgroud)
为了稍微组织一下代码,我将跟踪层配置移动到一个单独的函数中。诀窍是为此函数提供一个编译返回类型。
第一种方法是按原样移动代码并让 IDE 生成返回类型:
TraceLayer<SharedClassifier<ServerErrorsAsFailures>, fn(&Request<Body>) -> Span, fn(&Request<Body>, &Span), fn(&Response<BoxBody>, …Run Code Online (Sandbox Code Playgroud)