Einleitung: Warum Rust eine ausgezeichnete Wahl für HTTP-Anfragen ist
\nRust ist eine systemnahe Programmiersprache, die aufgrund ihrer Sicherheit, Leistungsfähigkeit und des Fehlens eines Garbage Collectors an Popularität gewonnen hat. Wenn Sie eine Netzwerkanwendung, einen Web-Scraper oder einen Microservice entwickeln, ist die Fähigkeit, HTTP-Anfragen in Rust korrekt durchzuführen, eine unverzichtbare Fähigkeit. In diesem Artikel werden wir durchgehen, wie man einen vollwertigen HTTP-Client in Rust mit der Bibliothek reqwest erstellt, die der De-facto-Standard für die Arbeit mit HTTP im Rust-Ökosystem ist.
Wir werden den Weg von der Installation der Abhängigkeiten bis zur Fehlerbehandlung und der Arbeit mit JSON gehen. Am Ende des Artikels werden Sie in der Lage sein, zuverlässige und schnelle HTTP-Clients in Rust zu schreiben, die Sie im Produktivbetrieb nicht im Stich lassen.
\n\nInstallation und Projekteinrichtung
\nDer erste Schritt ist die Erstellung eines neuen Projekts und das Hinzufügen der Abhängigkeit reqwest mit Unterstützung für Asynchronität und JSON.
cargo new rust_http_client\ncd rust_http_client\nÖffnen Sie Cargo.toml und fügen Sie hinzu:
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\nLassen Sie uns jede Abhängigkeit erklären:
\n- \n
- reqwest — der primäre HTTP-Client. Das Flag
jsonaktiviert die Unterstützung für Serialisierung/Deserialisierung. \n - tokio — die asynchrone Laufzeitumgebung von Rust. HTTP-Anfragen in
reqwestsind standardmäßig asynchron. \n - serde / serde_json — für die Arbeit mit JSON (Strukturen, Serialisierung). \n
Jetzt ist alles bereit zum Schreiben von Code.
\n\nBasis-GET-Anfrage: Daten vom Server abrufen
\nBeginnen wir mit einer einfachen GET-Anfrage. Erstellen wir eine Funktion, die Daten von einer öffentlichen API abruft und auf der Konsole ausgibt.
\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!("Status: {}", response.status());\n\n let body = response.text().await?;\n println!("Antworttext:\\n{}", body);\n\n Ok(())\n}\nWas hier passiert:
\n- \n
- Wir verwenden das Makro
#[tokio::main], um eine asynchrone Funktion zu starten. \n reqwest::get(url).await?führt eine GET-Anfrage aus. Das Zeichen?leitet den Fehler weiter, falls die Anfrage fehlschlägt. \nresponse.status()gibt den HTTP-Status zurück (z. B. 200 OK). \nresponse.text().await?extrahiert den Antworttext als Zeichenkette. \n
Führen Sie den Code mit dem Befehl cargo run aus. Sie sehen ein JSON-Objekt mit den Beitragsdaten.
Header und Anfrageparameter hinzufügen
\nIn realen Anwendungen müssen oft Header (z. B. API-Schlüssel) oder Query-Parameter übergeben werden. So geht's:
\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!("Anzahl der Beiträge: {}", posts.as_array().unwrap().len());\n\n Ok(())\n}\nWichtige Punkte:
\n- \n
- Wir erstellen einen
Client— dies ist ein wiederverwendbarer HTTP-Client mit einem Verbindungspool. Verwenden Sie für Produktionscode immer Client anstelle von direkten Aufrufen vonreqwest::get. \n - Die Methode
.header()fügt einen Header hinzu. \n .query()akzeptiert ein Wörterbuch mit Parametern und kodiert die URL automatisch. \n.json()deserialisiert sofort