0Pricing
Learn Rust Coding · درس

البرمجيات الوسيطة

طبقات Tower

البرمجيات الوسيطة درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ما البرمجيات الوسيطة؟

تنفّذ البرمجيات الوسيطة التعليمات قبل المعالج وبعده، فتغلف دورة الطلب والاستجابة. استخدموها للتسجيل والمصادقة والضغط وتحديد المهلات.

  • يعتمد Axum على منظومة tower
  • تُضاف البرمجيات الوسيطة على شكل طبقات

السمة Service

تعرّف Tower خدمة Service: وهي شيء يستقبل طلبًا وينتج استجابة بشكل غير متزامن. وتغلف الطبقات خدمةً داخل خدمة أخرى.

إضافة طبقة

أرفق البرمجيات الوسيطة باستخدام .layer(). نضيف هنا تتبع الطلبات من tower_http.

use axum::{Router, routing::get};
use tower_http::trace::TraceLayer;

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(TraceLayer::new_for_http())
}

ترتيب الطبقات

تغلف الطبقات من الأسفل إلى الأعلى: فالطبقة الأخيرة المضافة هي الخارجية. تتدفق الطلبات من الخارج إلى الداخل، والاستجابات من الداخل إلى الخارج.

use axum::{Router, routing::get};
use tower_http::{trace::TraceLayer, compression::CompressionLayer};

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(CompressionLayer::new())
        .layer(TraceLayer::new_for_http())
}

برمجيات وسيطة مخصصة باستخدام from_fn

يحوّل middleware::from_fn دالة غير متزامنة إلى برمجيات وسيطة. وتستقبل الدالة الطلب وNext لاستدعاء بقية السلسلة.

use axum::{middleware::Next, response::Response, extract::Request};

async fn log_mw(req: Request, next: Next) -> Response {
    println!("{} {}", req.method(), req.uri());
    next.run(req).await
}

توصيل البرمجيات الوسيطة المخصصة

غلّف دالتك باستخدام from_fn وأضفها كطبقة.

use axum::{Router, routing::get, middleware};

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(middleware::from_fn(log_mw))
}

إيقاف الطلبات مبكرًا

يمكن للبرمجيات الوسيطة الإرجاع مبكرًا من دون استدعاء next، وهذا مفيد للمصادقة. ويؤدي إرجاع استجابة إلى إيقاف السلسلة.

use axum::{middleware::Next, response::Response, extract::Request, http::StatusCode};

async fn auth(req: Request, next: Next) -> Result<Response, StatusCode> {
    if req.headers().contains_key("authorization") {
        Ok(next.run(req).await)
    } else {
        Err(StatusCode::UNAUTHORIZED)
    }
}

نمذجة سلسلة البرمجيات الوسيطة

السلسلة ليست سوى دوال تستدعي الدالة التالية. يحاكي هذا المثال القابل للتشغيل التغليف قبل التنفيذ وبعده.

fn handler() -> String {
    "response".to_string()
}

fn logging<F: Fn() -> String>(next: F) -> String {
    println!("-> request in");
    let res = next();
    println!("<- response out");
    res
}

fn main() {
    let out = logging(handler);
    println!("body: {}", out);
}

برمجيات وسيطة لكل مسار

طبّق طبقة على مسار واحد باستدعاء .layer() على Router الخاص بالطريقة بدلًا من التطبيق كله.

use axum::{Router, routing::get, middleware};

fn app() -> Router {
    Router::new().route(
        "/admin",
        get(|| async { "admin" }).layer(middleware::from_fn(auth)),
    )
}

طبقات tower_http الشائعة

توفر حزمة tower_http برمجيات وسيطة جاهزة:

  • TraceLayer للتسجيل
  • CompressionLayer للضغط باستخدام gzip
  • CorsLayer لـ CORS
  • TimeoutLayer لتحديد مدة الطلب
use tower_http::cors::CorsLayer;

fn cors() -> CorsLayer {
    CorsLayer::permissive()
}

تجميع الطبقات باستخدام ServiceBuilder

اجمع عدة طبقات بطريقة منظمة باستخدام ServiceBuilder، الذي يطبقها من الأعلى إلى الأسفل لترتيب يمكن التنبؤ به.

use tower::ServiceBuilder;
use tower_http::{trace::TraceLayer, compression::CompressionLayer};

fn stack() -> ServiceBuilder<impl Sized> {
    ServiceBuilder::new()
        .layer(TraceLayer::new_for_http())
        .layer(CompressionLayer::new())
}

تحقق سريع

اختبر مدى فهمك للبرمجيات الوسيطة.

مراجعة

لقد تعلمتم البرمجيات الوسيطة باستخدام طبقات tower:

  • أضيفوا البرمجيات الوسيطة عبر .layer()؛ وتكون الطبقة الأخيرة المضافة هي الخارجية
  • ينشئ from_fn برمجيات وسيطة مخصصة باستخدام Next
  • أعيدوا النتيجة مبكرًا لإيقاف السلسلة، مثلًا للمصادقة
  • توفر tower_http طبقات للتتبع والضغط وCORS وتحديد المهلات

بهذا تكتمل دورة Axum.

الأسئلة الشائعة

هل درس «البرمجيات الوسيطة» مجاني؟

نعم — نص درس «البرمجيات الوسيطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «البرمجيات الوسيطة»؟

طبقات Tower تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «البرمجيات الوسيطة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التوجيه في Axum
  2. المستخرِجات
  3. JSON والحالة
  4. البرمجيات الوسيطة
← العودة إلى Learn Rust Coding