lilydocs
HTTP APIWebSocketConsumer
İstek işleme2 dk okuma

Middleware

İstek ve yanıt akışını uygulama, controller veya action düzeyinde sarın.

Middleware, action’ın etrafında çalışan ortak HTTP davranışını tanımlar. Örneğin bir yanıt header’ı eklemek veya isteği erken reddetmek için kullanılır.

Bir middleware yazma#

middleware.rs
use std::sync::Arc;
use lilyrs::http_api::{
    ExecutionCancellation, Extensions, HttpExchange, HttpMiddleware,
    HttpMiddlewareError, HttpMiddlewareInitError, HttpNext, MiddlewareDescriptor,
    MiddlewareErrorCode, MiddlewareKind,
};

pub struct ResponseHeaderMiddleware;

#[lilyrs::http_api::async_trait::async_trait]
impl HttpMiddleware for ResponseHeaderMiddleware {
    async fn new(_: Arc<Extensions>) -> Result<Self, HttpMiddlewareInitError> { Ok(Self) }

    fn descriptor(&self) -> MiddlewareDescriptor {
        MiddlewareDescriptor::new("response_header", MiddlewareKind::Custom)
    }

    async fn handle(
        &self,
        exchange: &mut HttpExchange<'_>,
        next: HttpNext<'_>,
        _cancellation: ExecutionCancellation,
    ) -> Result<(), HttpMiddlewareError> {
        next.run(exchange).await?;
        exchange.response_mut().try_insert_header("x-framework", "lily")
            .map_err(|_| HttpMiddlewareError::internal(
                MiddlewareErrorCode::new("HEADER_WRITE_FAILED").unwrap()
            ))?;
        Ok(())
    }
}

Örnek downstream işlem döndükten sonra x-framework: lily header’ı ekler. Constructor uygulama başlangıcında çalışır. Descriptor label’ı sabit olmalı, kullanıcıdan gelen veri içermemelidir.

Uygulama düzeyinde kayıt#

AppBuilder zinciri
AppBuilder::new("127.0.0.1:8080")
    .middleware::<ResponseHeaderMiddleware>();

Bu parça builder oluşturur; gerçek başlangıçta build().await?.start().await? ile tamamlayın.

Controller ve action düzeyi#

Controller struct’ında veya action’da #[middleware(ResponseHeaderMiddleware)] kullanın. Controller ve action’dan oluşan birleşik listede aynı middleware türünün tekrarına izin verilmez.

Global kayıtta aynı tür, exclusive key yoksa iki kez kurulabilir. Bu nedenle her global türü bir kez kaydedin; otomatik deduplication varsaymayın. Controller/action ile global kayıt kapsamları arasındaki fark referansta açıklanmıştır.

Continuation ve erken ret#

next.run(exchange) tek kullanımlık continuation’dır. Bir kez çağırır, sonucu beklersiniz. Çağırmadan rejection dönmek isteği erken sonlandırır. Normal dönüş ters kayıt sırasıyla gerçekleşir.

ExecutionCancellation uzun süren işlerinizin durdurulma sinyalidir. next sonrasını streaming’in tamamlanma noktası veya bütün kesilmelere çalışan cleanup noktası olarak kullanmayın. Shutdown sayfası anormal termination hook’unu açıklar.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod