ما هو Actix-web ولماذا تحتاجه؟
\n\nActix-web هو إطار عمل ويب قوي وعملي وسريع للغاية للغة البرمجة Rust. وهو مبني على نموذج الممثل (مكتبة Actix) وبيئة التشغيل غير المتزامنة Tokio. يتيح Actix-web إنشاء تطبيقات ويب وواجهات برمجة تطبيقات عالية الأداء قادرة على معالجة ملايين الطلبات في الثانية.
\n\nلماذا تستخدم Actix-web؟
\n- \n
- الأداء: يحتل Actix-web باستمرار مرتبة بين أفضل ثلاثة أطر عمل ويب في العالم (وفقًا لاختبارات TechEmpower)، متجاوزًا حلولاً مثل Go net/http و Node.js Express. \n
- الأمان: يضمن Rust أمان الذاكرة في مرحلة الترجمة، مما يستبعد فئات كاملة من الثغرات (تجاوز سعة المخزن المؤقت، سباقات البيانات). \n
- أمان الأنواع: بفضل نظام الأنواع الصارم في Rust، يتم اكتشاف العديد من الأخطاء (مثل تنسيق JSON غير صحيح) في مرحلة الترجمة. \n
- عدم التزامن: الدعم الكامل لـ async/await يسمح بمعالجة آلاف الاتصالات المتزامنة دون إنشاء خيوط لكل منها. \n
- النظام البيئي: يتكامل Actix-web بسهولة مع كريتات Rust الأخرى: serde (التسلسل)، sqlx/diesel (قواعد البيانات)، reqwest (عميل HTTP). \n
Actix-web مثالي لـ: REST API، الخدمات المصغرة، خوادم WebSocket، تطبيقات الويب عالية التحميل، خوادم الوكيل.
\n\nتثبيت Actix-web
\n\nنظرًا لأن Actix-web هي مكتبة لـ Rust، يتم التثبيت عبر مدير الحزم cargo (مشابه لـ pip في Python).
الخطوة 1. تأكد من تثبيت Rust. تحقق باستخدام الأمر:
\nrustc --version\ncargo --version\nإذا لم يكن Rust مثبتًا، قم بتنزيله من rustup.rs.
\n\nالخطوة 2. أنشئ مشروعًا جديدًا:
\ncargo new my_actix_app\ncd my_actix_app\n\nالخطوة 3. أضف Actix-web إلى التبعيات. افتح ملف Cargo.toml وأضف:
[dependencies]\nactix-web = "4"\n\nالخطوة 4. قم بتثبيت التبعيات وبناء المشروع:
\ncargo build\n\nتم! يمكنك الآن استخدام Actix-web في مشروعك.
\n\nبداية سريعة: "Hello, World!" على Actix-web
\n\nلنقم بإنشاء خادم ويب بسيط يستجيب لطلبات GET.
\n\nمثال 1: خادم أدنى
\n// main.rs\nuse actix_web::{get, App, HttpResponse, HttpServer, Responder};\n\n#[get("/")]\nasync fn hello() -> impl Responder {\n HttpResponse::Ok().body("Hello, World!")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(hello)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n\nالتشغيل: cargo run
التحقق: افتح المتصفح على العنوان http://127.0.0.1:8080 أو نفذ:
curl http://127.0.0.1:8080\nسترى الرد: Hello, World!
الطرق والوظائف الأساسية في Actix-web
\n\nدعنا نستعرض العناصر الأساسية للإطار. لكل منها وصف ومعاملات ومثال عملي.
\n\n1. #[get("/path")] — ماكرو لمعالجة طلبات GET
\nما يفعله: يزين دالة غير متزامنة، محولاً إياها إلى معالج لطلبات HTTP GET على المسار المحدد.
\nالمعاملات: المسار (سلسلة نصية)، يمكن أن يحتوي على أجزاء ديناميكية (مثل /{id}).
مثال:
\nuse actix_web::{get, HttpResponse, Responder};\n\n#[get("/user/{id}")]\nasync fn get_user(path: actix_web::web::Path<String>) -> impl Responder {\n let user_id = path.into_inner();\n HttpRespons