كيفية كتابة REST API بلغة Rust في 30 دقيقة: دليل عملي

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

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

ابدأ الدورة

مقدمة: لماذا Rust لـ REST API؟

\n

Rust هي لغة برمجة نظامية حديثة تجمع بين أداء C/C++ وأمان الذاكرة بدون جامع القمامة. لإنشاء REST API، تقدم Rust عدة أطر عمل قوية، وActix-web هو واحد من أشهرها. في هذا الدليل، سنقوم خطوة بخطوة بإنشاء REST API كامل بلغة Rust في 30 دقيقة. سترى كيف يمكنك البدء بسرعة، حتى لو كنت مبتدئًا في Rust.

\n\n

تحضير البيئة

\n

قبل كتابة الكود، تأكد من تثبيت Rust. إذا لم يكن مثبتًا، قم بتنفيذ الأمر:

\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
\n

بعد التثبيت، تحقق من الإصدار:

\n
rustc --version
\n

الآن، أنشئ مشروعًا جديدًا:

\n
cargo new rust_rest_api\ncd rust_rest_api
\n

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

\n
[dependencies]\nactix-web = "4"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }
\n

قم بتشغيل cargo build لتثبيت جميع الحزم. سيستغرق ذلك 1-2 دقيقة.

\n\n

إنشاء REST API أساسي بلغة Rust

\n

لنبدأ بنقطة نهاية بسيطة تعيد تحية. افتح src/main.rs واكتب:

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

\n\n

إضافة هيكل البيانات وJSON

\n

REST API الحقيقي يعمل مع JSON. لننشئ نموذج مستخدم ونقطة نهاية للحصول عليه:

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

\n\n

العمل مع معاملات الطلب وطلبات POST

\n

يجب أن يتعامل API الحقيقي مع طرق HTTP المختلفة والمعاملات. لنضف نقطة نهاية لإنشاء مستخدم عبر POST:

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

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

لنضف نقطة نهاية للحصول على مستخدم بواسطة المعرف عبر معامل المسار:

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

المدونات

توصيات الكتب