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

ตัวดึงข้อมูล

แยกวิเคราะห์คำขอ

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

ตัวดึงข้อมูลคืออะไร

ตัวดึงข้อมูลคือพารามิเตอร์ของตัวจัดการที่ดึงส่วนหนึ่งของคำขอออกมาให้คุณ Axum จะตรวจสอบชนิดของพารามิเตอร์และเติมค่าให้

  • ไม่ต้องแยกวิเคราะห์คำขอด้วยตนเอง
  • ขับเคลื่อนด้วยชนิดข้อมูลและนำมาประกอบกันได้

ตัวดึงข้อมูล Path

Path จับเซกเมนต์แบบไดนามิกของ URL ชนิดข้อมูลด้านในจะกำหนดวิธีแยกวิเคราะห์เซกเมนต์นั้น

use axum::extract::Path;

async fn user(Path(id): Path<u32>) -> String {
    format!("user {}", id)
}

พารามิเตอร์เส้นทางหลายตัว

จับหลายเซกเมนต์ด้วยการดึงข้อมูลเป็นทูเพิล ลำดับจะตรงกับรูปแบบเส้นทาง

use axum::extract::Path;

async fn item(Path((cat, id)): Path<(String, u32)>) -> String {
    format!("{} / {}", cat, id)
}

ตัวดึงข้อมูล Query

Query แปลงสตริงคำค้นของ URL เป็นโครงสร้างโดยใช้ serde เหมาะสำหรับตัวกรองและการแบ่งหน้า

use axum::extract::Query;
use serde::Deserialize;

#[derive(Deserialize)]
struct Page { page: u32 }

async fn list(Query(p): Query<Page>) -> String {
    format!("page {}", p.page)
}

ตัวดึงข้อมูลเนื้อหา JSON

Json แปลงเนื้อหาคำขอเป็นโครงสร้าง โครงสร้างนั้นต้อง derive Deserialize

use axum::Json;
use serde::Deserialize;

#[derive(Deserialize)]
struct NewUser { name: String }

async fn create(Json(u): Json<NewUser>) -> String {
    format!("created {}", u.name)
}

ตัวดึงข้อมูลส่วนหัว

เข้าถึงส่วนหัวด้วยตัวดึงข้อมูล HeaderMap หรือตัวดึงข้อมูลส่วนหัวที่มีชนิดข้อมูล เหมาะสำหรับโทเค็นยืนยันตัวตน

use axum::http::HeaderMap;

async fn show(headers: HeaderMap) -> String {
    match headers.get("x-api-key") {
        Some(v) => format!("key: {:?}", v),
        None => "no key".to_string(),
    }
}

ลำดับของตัวดึงข้อมูลมีความสำคัญ

ตัวดึงข้อมูลที่ใช้เนื้อหา เช่น Json ต้องอยู่ท้ายสุดในรายการพารามิเตอร์ เพราะเนื้อหาสามารถอ่านได้เพียงครั้งเดียว

use axum::{Json, extract::Path};
use serde::Deserialize;

#[derive(Deserialize)]
struct Body { value: i32 }

async fn h(Path(id): Path<u32>, Json(b): Json<Body>) -> String {
    format!("{} {}", id, b.value)
}

การสร้างแบบจำลองการดึงข้อมูลใน Rust ธรรมดา

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

fn parse_query(q: &str) -> Option<u32> {
    q.strip_prefix("page=")?.parse().ok()
}

fn main() {
    println!("{:?}", parse_query("page=3"));
    println!("{:?}", parse_query("bad"));
}

การดึงข้อมูลแบบไม่บังคับ

ครอบตัวดึงข้อมูลด้วย Option เพื่อไม่ให้ข้อผิดพลาดยุติการทำงาน ค่าที่หายไปหรือไม่ถูกต้องจะให้ผลเป็น None แทนการตอบกลับด้วยข้อผิดพลาด

use axum::extract::Query;
use serde::Deserialize;

#[derive(Deserialize)]
struct Filter { q: String }

async fn search(filter: Option<Query<Filter>>) -> String {
    match filter {
        Some(Query(f)) => f.q,
        None => "no filter".to_string(),
    }
}

การปฏิเสธคำขอ

เมื่อตัวดึงข้อมูลทำงานล้มเหลว จะคืนค่าการปฏิเสธซึ่งกลายเป็นการตอบกลับข้อผิดพลาด HTTP เช่น JSON ที่ไม่ถูกต้องจะได้ 422 โดยอัตโนมัติ

use axum::extract::rejection::JsonRejection;
use axum::Json;

async fn create(body: Result<Json<i32>, JsonRejection>) -> String {
    match body {
        Ok(Json(n)) => format!("ok {}", n),
        Err(_) => "bad body".to_string(),
    }
}

การรวมตัวดึงข้อมูล

ตัวจัดการสามารถใช้ตัวดึงข้อมูลหลายตัวพร้อมกันได้ Axum จะเติมค่าแต่ละตัวจากส่วนที่เกี่ยวข้องของคำขอ

use axum::{Json, extract::{Path, Query}};
use serde::Deserialize;

#[derive(Deserialize)]
struct Q { sort: String }
#[derive(Deserialize)]
struct B { name: String }

async fn h(Path(id): Path<u32>, Query(q): Query<Q>, Json(b): Json<B>) -> String {
    format!("{} {} {}", id, q.sort, b.name)
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับตัวดึงข้อมูลของคุณ

ทบทวน

คุณได้เรียนรู้การแยกวิเคราะห์คำขอด้วยตัวดึงข้อมูลแล้ว:

  • Path สำหรับเซกเมนต์ URL และ Query สำหรับสตริงคำค้น
  • Json สำหรับเนื้อหา ซึ่งต้องอยู่ท้ายสุด
  • HeaderMap สำหรับส่วนหัว
  • Option และ Result จัดการความล้มเหลวได้อย่างเหมาะสม

ถัดไป: สถานะที่ใช้ร่วมกันและการตอบกลับ JSON

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

บทเรียน “ตัวดึงข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดึงข้อมูล”

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

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

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

บทเรียน “ตัวดึงข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

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