المستخرِجات
تحليل الطلبات
المستخرِجات درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ما المستخرج؟
المستخرج extractor هو معلمة في المعالج تستخرج جزءًا من الطلب نيابةً عنكم. يفحص 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 جسم الطلب إلى بنية. يجب أن تُشتق للبنية السمة 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.
الأسئلة الشائعة
هل درس «المستخرِجات» مجاني؟
نعم — نص درس «المستخرِجات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «المستخرِجات»؟
تحليل الطلبات تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المستخرِجات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التوجيه في Axum
- المستخرِجات
- JSON والحالة
- البرمجيات الوسيطة