مقدمة: لماذا Rust لـ REST API؟
\nRust هي لغة برمجة نظامية حديثة تجمع بين أداء C/C++ وأمان الذاكرة بدون جامع القمامة. لإنشاء REST API، تقدم Rust عدة أطر عمل قوية، وActix-web هو واحد من أشهرها. في هذا الدليل، سنقوم خطوة بخطوة بإنشاء REST API كامل بلغة Rust في 30 دقيقة. سترى كيف يمكنك البدء بسرعة، حتى لو كنت مبتدئًا في Rust.
\n\nتحضير البيئة
\nقبل كتابة الكود، تأكد من تثبيت Rust. إذا لم يكن مثبتًا، قم بتنفيذ الأمر:
\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nبعد التثبيت، تحقق من الإصدار:
\nrustc --version\nالآن، أنشئ مشروعًا جديدًا:
\ncargo new rust_rest_api\ncd rust_rest_api\nافتح ملف Cargo.toml وأضف التبعيات:
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }\nقم بتشغيل cargo build لتثبيت جميع الحزم. سيستغرق ذلك 1-2 دقيقة.
إنشاء REST API أساسي بلغة Rust
\nلنبدأ بنقطة نهاية بسيطة تعيد تحية. افتح src/main.rs واكتب:
use actix_web::{web, App, HttpServer, Responder};\n\nasync fn hello() -> impl Responder {\n "مرحبًا بالعالم! هذا REST API بلغة Rust!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n println!("الخادم يعمل على http://127.0.0.1:8080");\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(hello))\n })\n .bind("127.0.0.1:8080")?\n .run()\n .await\n}\nقم بتشغيل الخادم باستخدام الأمر cargo run وافتح في المتصفح http://127.0.0.1:8080. سترى تحيتنا. هذا هو أساس أي REST API بلغة Rust.
إضافة هيكل البيانات وJSON
\nREST API الحقيقي يعمل مع JSON. لننشئ نموذج مستخدم ونقطة نهاية للحصول عليه:
\nuse serde::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize)]\nstruct User {\n id: u32,\n name: String,\n email: String,\n}\n\nasync fn get_user() -> impl Responder {\n let user = User {\n id: 1,\n name: "إيفان بيتروف".to_string(),\n email: "ivan@example.com".to_string(),\n };\n web::Json(user)\n}\n\n// في main() أضف مسارًا جديدًا:\n// .route("/user", web::get().to(get_user))\nالآن، على العنوان /user ستحصل على كائن JSON. هذه نقطة رئيسية: Rust يقوم تلقائيًا بتسلسل الهيكل إلى JSON بفضل serde.
العمل مع معاملات الطلب وطلبات POST
\nيجب أن يتعامل API الحقيقي مع طرق HTTP المختلفة والمعاملات. لنضف نقطة نهاية لإنشاء مستخدم عبر POST:
\nuse actix_web::web::Json;\n\nasync fn create_user(user: Json<User>) -> impl Responder {\n let new_user = user.into_inner();\n println!("تم إنشاء المستخدم: {} ({})", new_user.name, new_user.email);\n web::Json(new_user)\n}\n\n// في main():\n// .route("/user", web::post().to(create_user))\nالآن يمكنك إرسال طلب POST مع جسم JSON، على سبيل المثال عبر curl:
curl -X POST http://127.0.0.1:8080/user \\\n -H "Content-Type: application/json" \\\n -d '{"id":2,"name":"ماريا سميرنوفا","email":"maria@example.com"}'\nسيعيد الخادم نفس الكائن، مؤكدًا الإنشاء. هذا هو أساس عمليات CRUD.
\n\nمعالجة معاملات المسار وسلسلة الاستعلام
\nلنضف نقطة نهاية للحصول على مستخدم بواسطة المعرف عبر معامل المسار:
\nuse actix_web::web::Path;\n\nasync fn get_user_by_id(path: Path<u32>) -> impl Responder {\n let user_id = path.into_inner();\n // في التطبيق الحقيقي، سيكون هنا استعلام لقاعدة البيانات\n