كيفية كتابة REST API على Rust في 30 دقيقة: دليل خطوة بخطوة

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

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

ابدأ الدورة

مقدمة: لماذا Rust لواجهات REST API؟



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



لماذا تختار Rust لواجهة API الخاصة بك؟



  • الأداء: تعمل Rust بمستوى C/C++، وهو أمر حاسم للأنظمة عالية التحميل.
  • الأمان: نظام الملكية (ownership) والاقتراض (borrowing) يستبعد فئات كاملة من الأخطاء المتعلقة بالذاكرة.
  • اللاتزامنية: الدعم المدمج لـ async/await يسمح بمعالجة آلاف الاتصالات بكفاءة.
  • النظام البيئي: Cargo (مدير الحزم) و crates.io يجعلان إدارة التبعيات بسيطة ومريحة.


سنقوم بإنشاء API بسيط لإدارة قائمة المهام (Todo list) تدعم عمليات CRUD. ستتعلم كيفية إعداد المسارات، ومعالجة JSON، والعمل مع حالة التطبيق.



الخطوة 1: إعداد المشروع وتثبيت التبعيات



أولاً، سننشئ مشروعًا جديدًا بلغة Rust باستخدام Cargo. افتح الطرفية ونفذ:



cargo new rust_todo_apicd rust_todo_api


الآن، سنقوم بتعديل ملف Cargo.toml بإضافة التبعيات اللازمة:



[package]name = "rust_todo_api"version = "0.1.0"edition = "2021"

[dependencies]actix-web = "4"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1", features = ["full"] }uuid = { version = "1", features = ["v4"] }


لنشرح سبب الحاجة لكل مكتبة:



  • actix-web — إطار عمل ويب غير متزامن عالي الأداء.
  • serde — مكتبة لتسلسل وإلغاء تسلسل البيانات (JSON).
  • serde_json — دعم تنسيق JSON لـ serde.
  • tokio — بيئة تشغيل غير متزامنة لـ Rust (يستخدمها actix-web افتراضيًا).
  • uuid — توليد معرفات فريدة لمهامنا.


بعد إضافة التبعيات، نفذ cargo build لتنزيل وتجميع جميع الحزم. قد يستغرق هذا بضع دقائق في التشغيل الأول.



الخطوة 2: إنشاء نموذج البيانات وهيكل التطبيق



لننشئ ملف src/main.rs ونحدد نموذج مهمتنا. سنستخدم هيكل TodoItem مع الحقول id و title و completed:



use actix_web::{web, App, HttpServer, HttpResponse, middleware};use serde::{Deserialize, Serialize};use std::sync::Mutex;use uuid::Uuid;

#[derive(Debug, Serialize, Deserialize, Clone)]struct TodoItem { id: String, title: String, completed: bool,}

#[derive(Debug, Deserialize)]struct CreateTodoRequest { title: String,}

#[derive(Debug, Deserialize)]struct UpdateTodoRequest { title: Option<String>, completed: Option<bool>,}

struct AppState { todos: Mutex<Vec<TodoItem>>,}


لاحظ التفاصيل المهمة:



  • Serialize و Deserialize — سمات من serde تقوم تلقائيًا بتوليد كود للعمل مع JSON.
  • Mutex — يُستخدم للوصول الآمن إلى الحالة المشتركة من عدة خيوط.
  • Uuid — يولد معرفات فريدة لكل مهمة.


الآن، سنضيف الدالة main التي ستشغل الخادم وتهيئ الحالة:



#[actix_web::main]async fn main() -> std::io::R

المدونات

توصيات الكتب