عميل HTTP بلغة Rust: إجراء الطلبات بشكل صحيح
Rust هي لغة برمجة أنظمة حديثة اكتسبت شعبية بفضل أدائها وأمان الذاكرة. ومع ذلك، يتساءل العديد من المطورين الذين اعتادوا على Python أو JavaScript: كيف يتم إجراء طلبات HTTP في Rust؟ في هذه المقالة، سنشرح إنشاء عميل HTTP بلغة Rust باستخدام المكتبة الشائعة reqwest. ستتعلم كيفية إجراء طلبات GET و POST، ومعالجة JSON، وإدارة الرؤوس، والعمل مع البرمجة غير المتزامنة. بعد القراءة، ستتمكن من دمج عميل HTTP بثقة في مشاريع Rust الخاصة بك.
1. التثبيت وإعداد البيئة
للبدء، سننشئ مشروع Rust جديد ونضيف التبعيات اللازمة. افتح الطرفية ونفّذ:
cargo new http_client_rustcd http_client_rustالآن، قم بتحرير ملف Cargo.toml وأضف التبعيات التالية:
[dependencies]reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"دعنا نشرح كل مكتبة:
- reqwest — عميل HTTP الرئيسي. العلم
jsonيضيف دعم تسلسل/إلغاء تسلسل JSON. - tokio — بيئة تشغيل غير متزامنة، ضرورية لعمل reqwest في الوضع غير المتزامن.
- serde و serde_json — للعمل مع هياكل JSON.
بعد إضافة التبعيات، نفّذ cargo build لتنزيل وترجمة جميع المكتبات.
2. طلب GET أساسي
لنبدأ بطلب GET بسيط إلى API عام. سننشئ هيكلًا للاستجابة وننفذ طلبًا إلى خدمة JSONPlaceholder:
use reqwest;use serde::Deserialize;
#[derive(Debug, Deserialize)]struct Post { userId: u32, id: u32, title: String, body: String,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let url = "https://jsonplaceholder.typicode.com/posts/1"; let response = reqwest::get(url).await?; let post: Post = response.json().await?; println!("{:#?}", post); Ok(())}دعنا نشرح الكود:
- السمة
#[derive(Debug, Deserialize)]تولد تلقائيًا traits للطباعة وإلغاء التسلسل. #[tokio::main]تحول الدالة إلى نقطة دخول غير متزامنة.reqwest::get()ينفذ طلب GET، و.awaitينتظر اكتماله.response.json()يحول استجابة JSON إلى هيكلنا.
قم بتشغيل الكود باستخدام الأمر cargo run. سترى بيانات المنشور في وحدة التحكم.
3. طلب POST مع إرسال البيانات
الآن، دعنا نشرح كيفية إرسال البيانات إلى الخادم. لطلب POST، سنحتاج إلى إنشاء هيكل للبيانات المرسلة واستخدام طريقة post():
use reqwest::Client;use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize)]struct NewPost { title: String, body: String, userId: u32,}
#[derive(Debug, Deserialize)]struct CreatedPost { id: u32, title: String, body: String, userId: u32,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let client = Client::new(); let new_post = NewPost { title: "أول منشور لي بلغة Rust".to_string(), body: "هذا هو نص المنشور المرسل باستخدام reqwest".to_string(), userId: 1, }; let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?; let created_post: CreatedPost = response.json().await?; println!("تم إنشاء منشور بالمعرف: {}", created_post.id); println