ตัวดึงข้อมูล
แยกวิเคราะห์คำขอ
ตัวดึงข้อมูล เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดเส้นทางด้วย Axum
- ตัวดึงข้อมูล
- JSON และสถานะ
- มิดเดิลแวร์