ما هو Axum ولماذا نستخدمه؟
Axum هو إطار عمل ويب حديث وسهل الاستخدام وعالي الأداء للغة Rust، تم تطويره بواسطة فريق Tokio. يعتمد على المكتبات الشهيرة tokio و tower و hyper، مما يضمن أداءً عاليًا ومعالجة غير متزامنة "مباشرة من الصندوق".
الهدف الرئيسي لـ Axum هو توفير واجهة برمجة تطبيقات (API) بديهية للمطورين لبناء تطبيقات وخدمات ويب، مع الحفاظ على قوة Rust وأمانها. على عكس الحلول "منخفضة المستوى"، يقوم Axum بتجريد تعقيد التعامل مع بروتوكول HTTP، مما يسمح لك بالتركيز على منطق الأعمال.
Axum مثالي من أجل:
- بناء RESTful APIs والخدمات المصغرة (Microservices)
- تطوير تطبيقات الويب مع عرض الخادم (Server-side rendering)
- بناء خوادم بروكسي و middleware
- تنفيذ اتصالات WebSocket
- أي سيناريو يتطلب أداءً عاليًا وموثوقية
تثبيت Axum
بما أن Rust هي لغة مترجمة، يتم التثبيت عبر مدير الحزم Cargo. أضف التبعيات التالية إلى ملف Cargo.toml الخاص بك:
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tower-http = { version = "0.5", features = ["cors", "trace"] }
tracing = "0.1"
tracing-subscriber = "0.3"
بعد ذلك، قم بتشغيل الأمر cargo build لتنزيل التبعيات وترجمتها.
بداية سريعة: أول تطبيق باستخدام Axum
أنشئ ملف src/main.rs واكتب خادم HTTP بسيط:
use axum::{
routing::get,
Router,
};
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
// إنشاء جهاز التوجيه
let app = Router::new()
.route("/", get(root_handler))
.route("/hello/:name", get(hello_handler));
// تشغيل الخادم
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
println!("الخادم يعمل على {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
async fn root_handler() -> &'static str {
"مرحبًا بك في الصفحة الرئيسية!"
}
async fn hello_handler(axum::extract::Path(name): axum::extract::Path) -> String {
format!("مرحبًا، {}!", name)
}
قم بتشغيل الخادم باستخدام الأمر cargo run وافتح المتصفح على الرابط http://localhost:3000/hello/العالم.
الدوال والطرق الأساسية في Axum
1. Router::new()
الوصف: تنشئ جهاز توجيه جديد وفارغ. هذه هي نقطة الدخول الرئيسية لتكوين تطبيقك.
المعاملات: لا يوجد.
مثال:
use axum::Router;
let app: Router = Router::new();
2. Router::route()
الوصف: تضيف مسارًا إلى المسار المحدد مع طريقة HTTP ومعالج معينين.
المعاملات:
path: &str— مسار المسار (يمكن أن يحتوي على أجزاء ديناميكية، مثل/users/:id)method_router: MethodRouter— نتيجة استدعاءget()أوpost()أوput()أوdelete()إلخ.
مثال:
use axum::{routing::get, Router};
async fn users_list() -> &'static str { "قائمة المستخدمين" }
async fn create_user() -> &'static str { "إنشاء مستخدم" }
let app = Router::new()
.route("/users", get(users_list).post(create_user));
3. routing::get(), post(), put(), delete()
الوصف: تنشئ معالجًا لطريقة HTTP المقابلة.
المعاملات:
handler: Handler— دالة غير متزامنة تقوم بمعالجة الطلب