标签: rust-tower

即使使用 CorsLayer,Axum 路由器也拒绝使用 405 进行 CORS 选项预检

fetch在发送a 之前,浏览器将发送一个请求方法OPTIONS来确认 API 将接受来自特定来源的脚本的请求。

\n

Chrome 显示我的 Axum 服务器正在拒绝我客户端的 405 请求。我的路由器如下所示:

\n
let app = Router::new()\n    .layer(TraceLayer::new_for_http())\n    .layer(CorsLayer::permissive())\n    .route("/api", post(server));\n
Run Code Online (Sandbox Code Playgroud)\n

Router::layer表示所有到router的请求都会被layer\xe2\x80\x99s对应的中间件处理。但我不确定它是否发挥了作用。

\n

cors http-status-code-405 rust rust-tower rust-axum

4
推荐指数
1
解决办法
6263
查看次数

有没有办法将变量绑定到 tower-http / hyper / axum 中的请求?

我正在尝试向每个跟踪事件添加请求 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 传递到外部任务队列中。有什么建议么?

rust hyper rust-tower rust-axum

2
推荐指数
1
解决办法
1419
查看次数

如何在单独的函数中配置 tower_http TraceLayer?

我正在实现 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)

rust rust-tower

2
推荐指数
1
解决办法
1127
查看次数

标签 统计

rust ×3

rust-tower ×3

rust-axum ×2

cors ×1

http-status-code-405 ×1

hyper ×1