HTTP-Client für Rust: Überblick über die besten Bibliotheken
Rust ist eine Systemprogrammiersprache, die zunehmend für die Erstellung von Webdiensten, Mikrodiensten und Netzwerktools verwendet wird. Die Wahl des richtigen HTTP-Clients ist entscheidend für Leistung, Sicherheit und Entwicklungsfreundlichkeit. In diesem Artikel betrachten wir die drei beliebtesten Bibliotheken für HTTP-Anfragen im Rust-Ökosystem: reqwest, ureq und hyper. Jede von ihnen hat ihre eigenen Stärken und eignet sich für verschiedene Szenarien.
1. Reqwest – Die universelle Wahl
Reqwest ist wohl die beliebteste Bibliothek für HTTP-Anfragen in Rust. Sie basiert auf hyper und bietet eine hochwertige, ergonomische API. Unterstützt sowohl asynchrone (über tokio) als auch synchrone Anfragen (durch Aktivierung des entsprechenden Flags).
Hauptmerkmale:
- Asynchrone und synchrone Modi.
- Automatische Behandlung von Weiterleitungen.
- Arbeit mit JSON (Serialisierung/Deserialisierung über
serde). - Unterstützung für Cookies, Proxy, TLS.
- Komfortable Arbeit mit Formularen und Multipart-Daten.
Beispiel einer asynchronen GET-Anfrage:
use reqwest;use serde::Deserialize;
#[derive(Deserialize, Debug)]struct ApiResponse { userId: u32, id: u32, title: String, completed: bool,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let url = "https://jsonplaceholder.typicode.com/todos/1"; let response: ApiResponse = reqwest::get(url) .await? .json() .await?;
println!("{:#?}", response); Ok(())}Dieses Beispiel zeigt, wie einfach es ist, eine GET-Anfrage durchzuführen und die JSON-Antwort in eine Struktur zu deserialisieren. Reqwest ist ideal für die meisten Projekte: von einfachen Skripten bis hin zu großen Webanwendungen.
2. Ureq – Minimalismus und Einfachheit
Ureq ist ein leichter, synchroner HTTP-Client. Sein Hauptvorteil ist die minimale Anzahl von Abhängigkeiten und das Fehlen einer asynchronen Laufzeitumgebung. Sie fügen einfach die Crate hinzu und verwenden sie. Ideal für CLI-Tools, Skripte und Situationen, in denen keine Asynchronität erforderlich ist.
Hauptmerkmale:
- Vollständig synchrone (blockierende) API.
- Minimale Anzahl von Abhängigkeiten (benötigt kein
tokio). - Integrierte Unterstützung für JSON und Cookies.
- Einfache Arbeit mit Headern und Parametern.
Beispiel einer POST-Anfrage mit JSON:
use ureq;use serde::Serialize;
#[derive(Serialize)]struct NewTodo { title: String, completed: bool,}
fn main() -> Result<(), ureq::Error> { let todo = NewTodo { title: "Rust lernen".into(), completed: false, };
let response = ureq::post("https://jsonplaceholder.typicode.com/todos") .set("Content-Type", "application/json") .send_json(&todo)?;
let status = response.status(); let body = response.into_string()?; println!("Status: {}, Body: {}", status, body); Ok(())}Ureq verzeiht Anfängern Fehler und ermöglicht schnelles Prototyping. Es ist jedoch nicht für hochbelastete asynchrone Systeme geeignet.
3. Hyper – Das Fundament des Ökosystems
Hyper ist eine low-level, asynchrone Bibliothek, auf der reqwest und viele andere Crates aufbauen. Sie bietet volle Kontrolle über die HTTP-Verbindung, erfordert aber mehr Code und Verständnis der asynchronen Programmierung. Wird in Produktionssystemen eingesetzt, in denen die Leistung entscheidend ist (z. B. in Datenbanken oder Proxy-Servern).
Hauptmerkmale:
- Asynchronität auf Basis von
tokio. - Volle Kontrolle über jeden Aspekt der Anfrage.