0Pricing
Learn Rust Coding · บทเรียน

มิดเดิลแวร์

เลเยอร์ของ Tower

มิดเดิลแวร์ เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

มิดเดิลแวร์คืออะไร

มิดเดิลแวร์จะเรียกใช้โค้ดก่อนและหลัง handler โดยครอบวงจรคำขอและการตอบกลับไว้ ใช้สำหรับการบันทึกล็อก การยืนยันตัวตน การบีบอัด และการจำกัดเวลา

  • Axum สร้างต่อยอดจากระบบนิเวศของ tower
  • เพิ่มมิดเดิลแวร์ในรูปแบบ เลเยอร์

เทรต Service

Tower กำหนด Service ซึ่งเป็นสิ่งที่รับคำขอและสร้างการตอบกลับแบบอะซิงโครนัส เลเยอร์จะครอบ service หนึ่งไว้ในอีก 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() บนเราเตอร์ของเมธอด แทนที่จะเรียกกับแอปทั้งหมด

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

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

เลเยอร์ tower_http ที่ใช้บ่อย

crate 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 เสร็จสมบูรณ์แล้ว

คำถามที่พบบ่อย

บทเรียน “มิดเดิลแวร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มิดเดิลแวร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์”

เลเยอร์ของ Tower คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “มิดเดิลแวร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเส้นทางด้วย Axum
  2. ตัวดึงข้อมูล
  3. JSON และสถานะ
  4. มิดเดิลแวร์
← กลับไปที่ Learn Rust Coding