Client HTTP en Rust : faire des requêtes correctement
Rust est un langage de programmation système moderne qui a gagné en popularité grâce à ses performances et sa sécurité mémoire. Cependant, de nombreux développeurs habitués à Python ou JavaScript se demandent : comment effectuer des requêtes HTTP en Rust ? Dans cet article, nous allons détailler la création d'un client HTTP en Rust en utilisant la bibliothèque populaire reqwest. Vous apprendrez à effectuer des requêtes GET et POST, à traiter du JSON, à gérer les en-têtes et à travailler avec l'asynchrone. Après cette lecture, vous serez capable d'intégrer un client HTTP dans vos projets Rust en toute confiance.
1. Installation et configuration de l'environnement
Pour commencer, créons un nouveau projet Rust et ajoutons les dépendances nécessaires. Ouvrez un terminal et exécutez :
cargo new http_client_rustcd http_client_rustModifiez maintenant le fichier Cargo.toml en ajoutant les dépendances suivantes :
[dependencies]reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"Détaillons chaque bibliothèque :
- reqwest — le client HTTP principal. Le flag
jsonajoute le support de la sérialisation/désérialisation JSON. - tokio — le runtime asynchrone nécessaire pour faire fonctionner reqwest en mode asynchrone.
- serde et serde_json — pour travailler avec les structures JSON.
Après avoir ajouté les dépendances, exécutez cargo build pour télécharger et compiler toutes les bibliothèques.
2. Requête GET basique
Commençons par une simple requête GET vers une API publique. Créons une structure pour la réponse et effectuons une requête vers le service 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(())}Détaillons le code :
- L'attribut
#[derive(Debug, Deserialize)]génère automatiquement les traits pour l'affichage et la désérialisation. #[tokio::main]transforme la fonction en point d'entrée asynchrone.reqwest::get()effectue une requête GET, et.awaitattend son achèvement.response.json()convertit la réponse JSON en notre structure.
Exécutez le code avec la commande cargo run. Vous verrez les données du post dans la console.
3. Requête POST avec envoi de données
Voyons maintenant comment envoyer des données vers un serveur. Pour une requête POST, nous devons créer une structure pour les données envoyées et utiliser la méthode 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: "Mon premier post en Rust".to_string(), body: "Ceci est le corps du post envoyé avec 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!("Post créé avec l'ID : {}", created_post.id); println