Introduction : Pourquoi Rust est un excellent choix pour les requêtes HTTP
\nRust est un langage de programmation système qui a gagné en popularité grâce à sa sécurité, ses performances et l'absence de ramasse-miettes. Si vous développez une application réseau, un web scraper ou un microservice, savoir effectuer correctement des requêtes HTTP en Rust est une compétence indispensable. Dans cet article, nous allons voir comment créer un client HTTP complet en Rust en utilisant la bibliothèque reqwest, qui est la référence de facto pour travailler avec HTTP dans l'écosystème Rust.
Nous parcourrons le chemin allant de l'installation des dépendances à la gestion des erreurs et au travail avec JSON. À la fin de cet article, vous serez capable d'écrire des clients HTTP fiables et rapides en Rust qui ne vous décevront pas en production.
\n\nInstallation et configuration du projet
\nLa première étape consiste à créer un nouveau projet et à ajouter la dépendance reqwest avec le support de l'asynchrone et de JSON.
cargo new rust_http_client\ncd rust_http_client\nOuvrez Cargo.toml et ajoutez :
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\nExpliquons chaque dépendance :
\n- \n
- reqwest — le client HTTP principal. Le flag
jsonactive le support de la sérialisation/désérialisation. \n - tokio — le runtime asynchrone de Rust. Les requêtes HTTP dans
reqwestsont asynchrones par défaut. \n - serde / serde_json — pour travailler avec JSON (structures, sérialisation). \n
Maintenant, tout est prêt pour écrire le code.
\n\nRequête GET basique : récupérer des données du serveur
\nCommençons par une simple requête GET. Créons une fonction qui récupère des données depuis une API publique et les affiche dans la console.
\nuse reqwest::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n let url = "https://jsonplaceholder.typicode.com/posts/1";\n let response = reqwest::get(url).await?;\n\n println!("Statut : {}", response.status());\n\n let body = response.text().await?;\n println!("Corps de la réponse :\\n{}", body);\n\n Ok(())\n}\nCe qui se passe ici :
\n- \n
- Nous utilisons la macro
#[tokio::main]pour lancer une fonction asynchrone. \n reqwest::get(url).await?exécute une requête GET. Le signe?propage l'erreur si la requête échoue. \nresponse.status()retourne le statut HTTP (par exemple, 200 OK). \nresponse.text().await?extrait le corps de la réponse sous forme de chaîne de caractères. \n
Exécutez le code avec la commande cargo run. Vous verrez un objet JSON contenant les données du post.
Ajouter des en-têtes et des paramètres de requête
\nDans les applications réelles, il est souvent nécessaire de transmettre des en-têtes (par exemple, une clé API) ou des paramètres de requête. Voici comment faire :
\nuse reqwest::Client;\nuse std::collections::HashMap;\n\n#[tokio::main]\nasync fn main() -> Result<(), reqwest::Error> {\n let client = Client::new();\n\n let mut params = HashMap::new();\n params.insert("userId", "1");\n\n let response = client\n .get("https://jsonplaceholder.typicode.com/posts")\n .header("Accept", "application/json")\n .query(¶ms)\n .send()\n .await?;\n\n let posts: serde_json::Value = response.json().await?;\n println!("Nombre de posts : {}", posts.as_array().unwrap().len());\n\n Ok(())\n}\nPoints clés :
\n- \n
- Nous créons un
Client— c'est un client HTTP réutilisable avec un pool de connexions. Utilisez toujours Client au lieu d'appels directs àreqwest::getpour le code de production. \n - La méthode
.header()ajoute un en-tête. \n .query()prend un dictionnaire de paramètres et encode automatiquement l'URL. \n.json()désérialise immédiatement la réponse en une valeur JSON. \n