ما هي مكتبة Hyper ولماذا تحتاجها
Hyper هي مكتبة HTTP غير متزامنة وعالية الأداء للغة Rust، مكتوبة بلغة Rust نفسها. تُعتبر واحدة من أشهر المكتبات وأكثرها احترامًا في نظام Rust البيئي للعمل مع بروتوكولي HTTP/1 و HTTP/2. توفر Hyper أجزاء العميل والخادم، مما يسمح للمطورين ببناء تطبيقات ويب وواجهات برمجية (API) سريعة وآمنة وفعالة.
الأسباب الرئيسية لاستخدام Hyper:
- الأداء العالي: تم بناء Hyper على بيئة Tokio غير المتزامنة ويستخدم الإدخال/الإخراج غير المحظور، مما يسمح بمعالجة آلاف الاتصالات المتزامنة بأقل استهلاك للموارد.
- الأمان: تضمن Rust أمان الذاكرة في مرحلة الترجمة، وتتبع Hyper هذه المبادئ، مما يقلل من مخاطر تسرب الذاكرة وتضارب البيانات.
- المرونة: توفر المكتبة تحكمًا منخفض المستوى في اتصالات HTTP، مما يسمح بتنفيذ أي منطق تقريبًا لمعالجة الطلبات.
- التوافق: Hyper هي الأساس للعديد من أطر عمل Rust الشهيرة الأخرى، مثل Warp و Axum و Tide.
- دعم HTTP/2: دعم مدمج لـ HTTP/2 لاستخدام أكثر كفاءة لموارد الشبكة.
تعتبر Hyper مثالية لبناء الخدمات المصغرة (Microservices)، والخوادم الوسيطة (Proxy Servers)، وبوابات API، وأي تطبيقات شبكة أخرى حيث السرعة والموثوقية أمران مهمان.
تثبيت مكتبة Hyper
يتم تثبيت Hyper في مشروع Rust عبر مدير الحزم Cargo. أضف التبعيات التالية إلى ملف Cargo.toml:
[dependencies]
hyper = { version = "1.5", features = ["full"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
شرح التبعيات:
- hyper: المكتبة الأساسية مع تفعيل جميع الميزات (خادم، عميل، HTTP/2).
- tokio: بيئة التشغيل غير المتزامنة الضرورية لعمل Hyper.
- serde و serde_json: لتسلسل وإلغاء تسلسل البيانات (ستحتاجها في الأمثلة).
بعد إضافة التبعيات، قم بتنفيذ الأمر cargo build لتحميل المكتبات وترجمتها.
بداية سريعة: خادم HTTP بسيط
لنقم بإنشاء خادم HTTP بسيط يرد بـ "Hello, World!" على أي طلب. قم بإنشاء ملف src/main.rs بالمحتوى التالي:
use hyper::service::{service_fn, Service};
use hyper::{Body, Request, Response, Server};
use std::convert::Infallible;
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
// تعريف نوع الخدمة الخاصة بنا
struct HelloWorld;
impl Service<Request<Body>> for HelloWorld {
type Response = Response<Body>;
type Error = Infallible;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, _req: Request<Body>) -> Self::Future {
let response = Response::builder()
.status(200)
.header("Content-Type", "text/plain")
.body(Body::from("Hello, World!"))
.unwrap();
Box::pin(async { Ok(response) })
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let addr = ([127, 0, 0, 1], 3000).into();
let server = Server::bind(&addr).serve(service_fn(|req| async move {
let response = Response::builder()
.status(200)
.header("Content-Type", "text/plain")
.body(Body::from("Hello, World!"))
.unwrap();
Ok::<_, Infallible>(response)
}));
println!("الخادم يعمل على http://127.0.0.1:3000");
if let Err(e) = server.await {
eprintln!("خطأ في الخادم: {}", e);
}
Ok(())
}
الآن قم بتشغيل الأمر cargo run، ثم افتح المتصفح على http://127.0.0.1:3000 وسترى رسالة "Hello, World!".