HTTP-Client in Rust: Anfragen richtig von A bis Z stellen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum einen HTTP-Client in Rust schreiben?

Moderne Entwicklung kommt selten ohne Interaktion mit externen Diensten aus. Ob es sich um eine REST-API für das Wetter, eine Datenbank oder eine Microservice-Architektur handelt – die Fähigkeit, HTTP-Anfragen zu senden, ist eine grundlegende Fertigkeit. Rust, mit seinem Fokus auf Leistung und Sicherheit, bietet mehrere elegante Lösungen für die Arbeit mit HTTP. In diesem Artikel werden wir uns ansehen, wie man HTTP-Clients in Rust richtig erstellt: von der Auswahl der Bibliothek bis zur Verarbeitung komplexer Szenarien.



Wir werden die beiden beliebtesten Bibliotheken betrachten: reqwest (asynchroner Standard) und ureq (einfacher synchroner Ansatz). Sie erfahren, wie Sie GET- und POST-Anfragen senden, JSON verarbeiten, Header verwalten und typische Fehler vermeiden.



1. Bibliotheksauswahl: reqwest vs ureq



Bevor wir Code schreiben, müssen wir uns für das Werkzeug entscheiden. Im Rust-Ökosystem gibt es zwei Hauptkandidaten.



1.1. Reqwest – leistungsstark und asynchron

reqwest ist der De-facto-Standard für HTTP-Anfragen in Rust. Es basiert auf hyper und tokio, unterstützt Asynchronität, automatische JSON-Serialisierung/Deserialisierung und die Arbeit mit Cookies. Ideal für hochlastige Anwendungen und Webserver.



Fügen Sie für den Einstieg Folgendes in Ihre Cargo.toml ein:

[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 – Einfachheit ohne Asynchronität

Wenn Sie keine asynchronen Aufrufe benötigen und ein einfaches Skript oder ein CLI-Tool schreiben, ist ureq eine ausgezeichnete Wahl. Es ist synchron, minimalistisch und erfordert keine komplexe Laufzeitkonfiguration.



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


Wann was wählen? Für Webserver und komplexe Anwendungen – reqwest. Für einfache Aufgaben, Tests und Skripte – ureq.



2. Basis-Anfragen: GET und POST



Betrachten wir praktische Beispiele für beide Bibliotheken.



2.1. GET-Anfrage mit reqwest

Das einfachste Beispiel – das Abrufen von Daten von einer öffentlichen API. Wir verwenden eine asynchrone main-Funktion mit dem Makro #[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?;

// Überprüfen des Antwortstatus if response.status().is_success() { let body = response.text().await?; println!("Antwort: {}", body); } else { eprintln!("HTTP-Fehler: {}", response.status()); }

Ok(())}


2.2. POST-Anfrage mit JSON-Body (reqwest)

Das Senden von Daten erfordert oft die Serialisierung einer Struktur. Dazu verwenden wir die 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: "Hallo Rust".to_string(), body: "Dies ist der Anfragetext".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!("Erstellter Beitrag: {:?}", created_post);

Ok(())}


2.3. Einfaches GET mit ureq

Mit ureq wird der Code kürzer, da keine Asynchronität erforderlich ist:



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

fn

Blogs

Buchempfehlungen