Actix-web لـ Rust: دليل شامل مع أمثلة

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

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

ابدأ الدورة

ما هو Actix-web ولماذا تحتاجه؟

\n\n

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

Actix-web مثالي لـ: REST API، الخدمات المصغرة، خوادم WebSocket، تطبيقات الويب عالية التحميل، خوادم الوكيل.

\n\n

تثبيت Actix-web

\n\n

نظرًا لأن Actix-web هي مكتبة لـ Rust، يتم التثبيت عبر مدير الحزم cargo (مشابه لـ pip في Python).

\n\n

الخطوة 1. تأكد من تثبيت Rust. تحقق باستخدام الأمر:

\n
rustc --version\ncargo --version
\n

إذا لم يكن Rust مثبتًا، قم بتنزيله من rustup.rs.

\n\n

الخطوة 2. أنشئ مشروعًا جديدًا:

\n
cargo new my_actix_app\ncd my_actix_app
\n\n

الخطوة 3. أضف Actix-web إلى التبعيات. افتح ملف Cargo.toml وأضف:

\n
[dependencies]\nactix-web = "4"
\n\n

الخطوة 4. قم بتثبيت التبعيات وبناء المشروع:

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

\n

التحقق: افتح المتصفح على العنوان http://127.0.0.1:8080 أو نفذ:

\n
curl http://127.0.0.1:8080
\n

سترى الرد: Hello, World!

\n\n

الطرق والوظائف الأساسية في Actix-web

\n\n

دعنا نستعرض العناصر الأساسية للإطار. لكل منها وصف ومعاملات ومثال عملي.

\n\n

1. #[get("/path")] — ماكرو لمعالجة طلبات GET

\n

ما يفعله: يزين دالة غير متزامنة، محولاً إياها إلى معالج لطلبات HTTP GET على المسار المحدد.

\n

المعاملات: المسار (سلسلة نصية)، يمكن أن يحتوي على أجزاء ديناميكية (مثل /{id}).

\n

مثال:

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

توصيات