Client HTTP en Rust : faire des requêtes correctement de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi écrire un client HTTP en Rust ?

Le développement moderne passe rarement sans interaction avec des services externes. Qu'il s'agisse d'une API REST météo, d'une base de données ou d'une architecture de microservices — savoir envoyer des requêtes HTTP est une compétence de base. Rust, avec son accent sur la performance et la sécurité, propose plusieurs solutions élégantes pour travailler avec HTTP. Dans cet article, nous allons voir comment créer correctement des clients HTTP en Rust : du choix de la bibliothèque à la gestion de scénarios complexes.



Nous examinerons les deux bibliothèques les plus populaires : reqwest (standard asynchrone) et ureq (approche synchrone simple). Vous apprendrez à envoyer des requêtes GET et POST, à traiter du JSON, à gérer les en-têtes et à éviter les erreurs typiques.



1. Choix de la bibliothèque : reqwest vs ureq



Avant d'écrire du code, il faut choisir l'outil. Dans l'écosystème Rust, il y a deux principaux candidats.



1.1. Reqwest — puissant et asynchrone

reqwest est le standard de facto pour les requêtes HTTP en Rust. Il est basé sur hyper et tokio, prend en charge l'asynchrone, la sérialisation/désérialisation automatique du JSON et la gestion des cookies. Idéal pour les applications à forte charge et les serveurs web.



Pour commencer, ajoutez dans 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 — simplicité sans asynchrone

Si vous n'avez pas besoin d'appels asynchrones et que vous écrivez un script simple ou un utilitaire CLI, ureq sera un excellent choix. Il est synchrone, minimaliste et ne nécessite pas de configuration complexe du runtime.



[dependencies]ureq = "2.9"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"


Quand choisir quoi ? Pour les serveurs web et les applications complexes — reqwest. Pour les tâches simples, les tests et les scripts — ureq.



2. Requêtes de base : GET et POST



Voyons des exemples pratiques pour les deux bibliothèques.



2.1. Requête GET avec reqwest

L'exemple le plus simple — récupérer des données depuis une API publique. Nous utilisons une fonction main asynchrone avec la macro #[tokio::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?;

// Vérifions le statut de la réponse if response.status().is_success() { let body = response.text().await?; println!("Réponse : {}", body); } else { eprintln!("Erreur HTTP : {}", response.status()); }

Ok(())}


2.2. Requête POST avec corps JSON (reqwest)

L'envoi de données nécessite souvent la sérialisation d'une structure. Pour cela, utilisons la crate 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: "Ceci est le corps de la requête".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!("Post créé : {:?}", created_post);

Ok(())}


2.3. GET simple avec ureq

Avec ureq, le code devient plus court car il ne nécessite pas d'asynchrone :



use ureq;use std::error::Error;

fn

Blogs

Book Recommendations