عميل HTTP بلغة Rust: إجراء الطلبات بشكل صحيح من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا Rust هو خيار ممتاز لطلبات HTTP

\n

Rust هي لغة برمجة أنظمة اكتسبت شعبية بفضل أمانها وأدائها وعدم وجود جامع للقمامة. إذا كنت تطور تطبيق شبكة، أو أداة استخراج بيانات من الويب، أو خدمة مصغرة، فإن معرفة كيفية تنفيذ طلبات HTTP بشكل صحيح بلغة Rust هي مهارة أساسية. في هذه المقالة، سنشرح كيفية إنشاء عميل HTTP كامل بلغة Rust باستخدام مكتبة reqwest، والتي تعتبر المعيار الفعلي للعمل مع HTTP في نظام Rust البيئي.

\n

سننتقل من تثبيت التبعيات إلى معالجة الأخطاء والعمل مع JSON. بنهاية المقالة، ستتمكن من كتابة عملاء HTTP موثوقين وسريعين بلغة Rust لن يخذلكم في بيئة الإنتاج.

\n\n

تثبيت وإعداد المشروع

\n

الخطوة الأولى هي إنشاء مشروع جديد وإضافة تبعية reqwest مع دعم التزامن و JSON.

\n
cargo new rust_http_client\ncd rust_http_client
\n

افتح ملف Cargo.toml وأضف:

\n
[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\n

طلب GET أساسي: الحصول على بيانات من الخادم

\n

لنبدأ بطلب GET بسيط. سننشئ دالة تحصل على بيانات من API عام وتعرضها في وحدة التحكم.

\n
use 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(&params)\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() تقوم فورًا بإلغاء تسلسل

المدونات

توصيات الكتب