ما هو Reqwest ولماذا تحتاجه؟
\n\nReqwest هي واحدة من أشهر وأسهل المكتبات لتنفيذ طلبات HTTP بلغة Rust. توفر واجهة برمجة تطبيقات (API) عالية المستوى ومريحة، مبنية على محرك HTTP غير المتزامن hyper و tokio. إذا كنت تكتب في Rust أداة لاستخراج بيانات الويب، أو عميلاً لـ REST API، أو بوتاً لـ Telegram، أو ببساطة تريد تنزيل ملف - فإن Reqwest ستكون أداتك الأساسية.
تدعم المكتبة كلاً من الطلبات غير المتزامنة (الافتراضية) والمتزامنة (الحاجبة)، والعمل مع JSON، و multipart/form-data، وملفات تعريف الارتباط (الكوكيز)، والبروكسي، و TLS/SSL، وإعادة التوجيه، وغيرها الكثير. تم تصميم Reqwest لتكون بديهية للمطورين الملمين بمكتبة Python requests أو مكتبة JavaScript fetch.
الإمكانيات الرئيسية:
\n- \n
- طلبات HTTP/HTTPS غير متزامنة ومتزامنة (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) \n
- تسلسل وإلغاء تسلسل JSON تلقائياً (عبر
serde) \n - دعم multipart/form-data لرفع الملفات \n
- إدارة ملفات تعريف الارتباط (مخزن الكوكيز) \n
- دعم البروكسي (HTTP, HTTPS, SOCKS5) \n
- تخصيص المهلات الزمنية، والترويسات، و User-Agent \n
- العمل مع التدفقات (streaming) للردود الكبيرة \n
- الأمان الافتراضي (التحقق من شهادات SSL) \n
التثبيت
\n\nلاستخدام Reqwest، ستحتاج إلى مشروع Rust مع ملف Cargo.toml. أضف التبعية في قسم [dependencies]:
[dependencies]\nreqwest = { version = "0.12", features = ["json", "multipart", "cookies", "socks"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\n\nشرح الميزات (features):
\n- \n
json— يتضمن دعم تسلسل/إلغاء تسلسل JSON عبر serde. \n multipart— لإرسال multipart/form-data. \n cookies— للإدارة التلقائية لملفات تعريف الارتباط. \n socks— لدعم بروكسي SOCKS5. \n - إذا كنت تحتاج فقط إلى عميل متزامن (حاجب)، أضف الميزة
blocking. \n
للاستخدام المتزامن (بدون عدم تزامن) يمكنك التوصيل كالتالي:
\n\nreqwest = { version = "0.12", features = ["blocking", "json"] }\n\nبداية سريعة مع مثال كود
\n\nلنقم بطلب GET بسيط إلى API عام ونعرض النتيجة. أنشئ ملف main.rs:
use reqwest;\nuse std::error::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n // تنفيذ طلب GET\n let response = reqwest::get("https://api.github.com/repos/rust-lang/rust")\n .await?;\n\n // التحقق من الحالة\n if response.status().is_success() {\n // تحليل جسم الرد كـ JSON (بدون كتابة صارمة)\n let body: serde_json::Value = response.json().await?;\n println!("اسم المستودع: {}", body["full_name"]);\n println!("الوصف: {}", body["description"].as_str().unwrap_or("لا يوجد وصف"));\n println!("النجوم: {}", body["stargazers_count"]);\n } else {\n eprintln!("خطأ: {}", response.status());\n }\n\n Ok(())\n}\n\nقم بتشغيله باستخدام الأمر cargo run. يجب أن ترى معلومات حول مستودع Rust.
الطرق والوظائف الأساسية
\n\n1. reqwest::get()
\nما تفعله: تنفيذ طلب HTTP GET إلى عنوان URL المحدد. هذه هي أبسط طريقة للحصول على البيانات. تُرجع Response.
المعلمات:
\n- \n
url: impl IntoUrl— سلسلة نصية أو عنوان URL حيث يتم إرسال الطلب. \n
مثال:
\nlet resp = reqwest::get("https://httpbin.org/get"