परिचय: Rust में HTTP क्लाइंट क्यों लिखें?
आधुनिक डेवलपमेंट शायद ही बाहरी सेवाओं के साथ इंटरैक्शन के बिना चलता है। चाहे वह मौसम का REST API हो, डेटाबेस हो या माइक्रोसर्विस आर्किटेक्चर - HTTP अनुरोध भेजने की क्षमता एक बुनियादी कौशल है। Rust, प्रदर्शन और सुरक्षा पर अपने जोर के साथ, HTTP के साथ काम करने के लिए कई सुरुचिपूर्ण समाधान प्रदान करता है। इस लेख में, हम देखेंगे कि Rust में HTTP क्लाइंट को सही तरीके से कैसे बनाया जाए: लाइब्रेरी चुनने से लेकर जटिल परिदृश्यों को संभालने तक।
हम दो सबसे लोकप्रिय लाइब्रेरीज़ पर विचार करेंगे: reqwest (एसिंक्रोनस मानक) और ureq (सरल सिंक्रोनस दृष्टिकोण)। आप सीखेंगे कि GET और POST अनुरोध कैसे भेजें, JSON को कैसे संभालें, हेडर को कैसे प्रबंधित करें और सामान्य गलतियों से कैसे बचें।
1. लाइब्रेरी चुनना: reqwest बनाम ureq
कोड लिखने से पहले, आपको टूल पर निर्णय लेना होगा। Rust इकोसिस्टम में दो मुख्य उम्मीदवार हैं।
1.1. Reqwest - शक्तिशाली और एसिंक्रोनस
reqwest Rust में HTTP अनुरोधों के लिए वास्तविक मानक है। यह hyper और tokio पर आधारित है, एसिंक्रोनसिटी, स्वचालित JSON सीरियलाइज़ेशन/डीसीरियलाइज़ेशन और कुकीज़ के साथ काम करने का समर्थन करता है। उच्च-लोड अनुप्रयोगों और वेब सर्वरों के लिए आदर्श।
शुरू करने के लिए Cargo.toml में जोड़ें:
[dependencies]reqwest = { version = "0.12", features = ["json"] }tokio = { version = "1", features = ["full"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"1.2. Ureq - एसिंक्रोनसिटी के बिना सादगी
यदि आपको एसिंक्रोनस कॉल की आवश्यकता नहीं है और आप एक सरल स्क्रिप्ट या CLI उपयोगिता लिख रहे हैं, तो ureq एक उत्कृष्ट विकल्प होगा। यह सिंक्रोनस, न्यूनतम है और इसमें जटिल रनटाइम सेटअप की आवश्यकता नहीं है।
[dependencies]ureq = "2.9"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"कब क्या चुनें? वेब सर्वर और जटिल अनुप्रयोगों के लिए - reqwest। सरल कार्यों, परीक्षणों और स्क्रिप्ट के लिए - ureq।
2. बुनियादी अनुरोध: GET और POST
दोनों लाइब्रेरीज़ के लिए व्यावहारिक उदाहरण देखें।
2.1. reqwest के साथ GET अनुरोध
सबसे सरल उदाहरण - सार्वजनिक API से डेटा प्राप्त करना। हम मैक्रो #[tokio::main] के साथ एक एसिंक्रोनस फंक्शन main का उपयोग करते हैं।
use reqwest;use std::error::Error;
#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { let url = "https://jsonplaceholder.typicode.com/posts/1"; let response = reqwest::get(url).await?;
// प्रतिक्रिया की स्थिति जांचें if response.status().is_success() { let body = response.text().await?; println!("उत्तर: {}", body); } else { eprintln!("HTTP त्रुटि: {}", response.status()); }
Ok(())}2.2. JSON बॉडी के साथ POST अनुरोध (reqwest)
डेटा भेजने के लिए अक्सर संरचना के सीरियलाइज़ेशन की आवश्यकता होती है। इसके लिए हम क्रेट serde का उपयोग करते हैं।
use reqwest;use serde::{Deserialize, Serialize};use std::error::Error;
#[derive(Serialize, Deserialize, Debug)]struct Post { title: String, body: String, user_id: i32,}
#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { let client = reqwest::Client::new(); let new_post = Post { title: "Hello Rust".to_string(), body: "यह अनुरोध का बॉडी है".to_string(), user_id: 1, };
let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?;
let created_post: Post = response.json().await?; println!("बनाया गया पोस्ट: {:?}", created_post);
Ok(())}2.3. ureq के साथ सरल GET
ureq के साथ कोड छोटा हो जाता है, क्योंकि इसमें एसिंक्रोनसिटी की आवश्यकता नहीं है:
use ureq;use std::error::Error;
fn