Capas de middleware en Rust
Una capa envuelve cada ruta debajo de ella: logging, timeouts, compresión.
use std::time::Instant;
use axum::extract::Request;
use axum::middleware::{self, Next};
use axum::response::Response;
use axum::{routing::get, Router};
async fn timing(request: Request, next: Next) -> Response {
let method = request.method().clone();
let path = request.uri().path().to_string();
let started = Instant::now();
let response = next.run(request).await;
println!("{method} {path} -> {} in {:?}", response.status(),
started.elapsed());
response
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(|| async { "ok" }))
.layer(middleware::from_fn(timing));
let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}
Cómo funciona
layeraplica un servicio de tower al router entero.middleware::from_fnconvierte una async fn en una capa.- Las capas corren de afuera hacia adentro, al revés del orden en que se agregan.
Palabras clave y builtins usados aquí
asyncawaitfnletselfuse
El intento, en números
- Líneas
- 30
- Caracteres a escribir
- 719
- Tokens
- 217
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 118 segundos.
Paso 3 de 3 en Respuestas y middleware; paso 8 de 9 en Servicios web con axum.