มิดเดิลแวร์
เลเยอร์ของ 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สำหรับ gzipCorsLayerสำหรับ CORSTimeoutLayerสำหรับจำกัดเวลาของคำขอ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ