مقدمة: لماذا Rust هو خيار ممتاز لطلبات HTTP
\nRust هي لغة برمجة أنظمة اكتسبت شعبية بفضل أمانها وأدائها وعدم وجود جامع للقمامة. إذا كنت تطور تطبيق شبكة، أو أداة استخراج بيانات من الويب، أو خدمة مصغرة، فإن معرفة كيفية تنفيذ طلبات HTTP بشكل صحيح بلغة Rust هي مهارة أساسية. في هذه المقالة، سنشرح كيفية إنشاء عميل HTTP كامل بلغة Rust باستخدام مكتبة reqwest، والتي تعتبر المعيار الفعلي للعمل مع HTTP في نظام Rust البيئي.
سننتقل من تثبيت التبعيات إلى معالجة الأخطاء والعمل مع JSON. بنهاية المقالة، ستتمكن من كتابة عملاء HTTP موثوقين وسريعين بلغة Rust لن يخذلكم في بيئة الإنتاج.
\n\nتثبيت وإعداد المشروع
\nالخطوة الأولى هي إنشاء مشروع جديد وإضافة تبعية reqwest مع دعم التزامن و JSON.
cargo new rust_http_client\ncd rust_http_client\nافتح ملف Cargo.toml وأضف:
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\nشرح كل تبعية:
\n- \n
- reqwest — عميل HTTP الرئيسي. العلم
jsonيضيف دعم التسلسل/إلغاء التسلسل. \n - tokio — بيئة تشغيل غير متزامنة لـ Rust. طلبات HTTP في
reqwestتكون غير متزامنة افتراضيًا. \n - serde / serde_json — للعمل مع JSON (الهياكل، التسلسل). \n
الآن كل شيء جاهز لكتابة الكود.
\n\nطلب GET أساسي: الحصول على بيانات من الخادم
\nلنبدأ بطلب GET بسيط. سننشئ دالة تحصل على بيانات من API عام وتعرضها في وحدة التحكم.
\nuse reqwest::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n let url = "https://jsonplaceholder.typicode.com/posts/1";\n let response = reqwest::get(url).await?;\n\n println!("الحالة: {}", response.status());\n\n let body = response.text().await?;\n println!("محتوى الاستجابة:\\n{}", body);\n\n Ok(())\n}\nما يحدث هنا:
\n- \n
- نستخدم الماكرو
#[tokio::main]لتشغيل دالة غير متزامنة. \n reqwest::get(url).await?ينفذ طلب GET. علامة?تمرر الخطأ إذا فشل الطلب.response.status()يعيد حالة HTTP (مثل 200 OK).response.text().await?يستخرج محتوى الاستجابة كنص.
قم بتشغيل الكود باستخدام الأمر cargo run. سترى كائن JSON يحتوي على بيانات المنشور.
إضافة الرؤوس ومعاملات الطلب
في التطبيقات الحقيقية، غالبًا ما تحتاج إلى تمرير رؤوس (مثل مفتاح API) أو معاملات استعلام. إليك كيفية القيام بذلك:
use reqwest::Client;\nuse std::collections::HashMap;\n\n#[tokio::main]\nasync fn main() -> Result<(), reqwest::Error> {\n let client = Client::new();\n\n let mut params = HashMap::new();\n params.insert("userId", "1");\n\n let response = client\n .get("https://jsonplaceholder.typicode.com/posts")\n .header("Accept", "application/json")\n .query(¶ms)\n .send()\n .await?;\n\n let posts: serde_json::Value = response.json().await?;\n println!("عدد المنشورات: {}", posts.as_array().unwrap().len());\n\n Ok(())\n}
النقاط الرئيسية:
- ننشئ
Client— وهو عميل HTTP قابل لإعادة الاستخدام مع مجموعة اتصالات. استخدم دائمًا Client بدلاً من الاستدعاءات المباشرة لـreqwest::getفي كود الإنتاج. - طريقة
.header()تضيف رأسًا. .query()تأخذ قاموسًا من المعاملات وتقوم بترميز URL تلقائيًا..json()تقوم فورًا بإلغاء تسلسل