HTTP-Client in Rust: Anfragen richtig stellen
Rust ist eine moderne Systemprogrammiersprache, die aufgrund ihrer Leistung und Speichersicherheit an Popularität gewonnen hat. Viele Entwickler, die an Python oder JavaScript gewöhnt sind, fragen sich jedoch: Wie führt man HTTP-Anfragen in Rust durch? In diesem Artikel werden wir die Erstellung eines HTTP-Clients in Rust unter Verwendung der beliebten Bibliothek reqwest behandeln. Sie erfahren, wie Sie GET- und POST-Anfragen durchführen, JSON verarbeiten, Header verwalten und mit Asynchronität arbeiten. Nach der Lektüre können Sie einen HTTP-Client sicher in Ihre Rust-Projekte integrieren.
1. Installation und Einrichtung der Umgebung
Erstellen wir zunächst ein neues Rust-Projekt und fügen die erforderlichen Abhängigkeiten hinzu. Öffnen Sie das Terminal und führen Sie Folgendes aus:
cargo new http_client_rustcd http_client_rustBearbeiten Sie nun die Datei Cargo.toml und fügen Sie die folgenden Abhängigkeiten hinzu:
[dependencies]reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"Lassen Sie uns jede Bibliothek erklären:
- reqwest — der primäre HTTP-Client. Das Flag
jsonfügt Unterstützung für JSON-Serialisierung/Deserialisierung hinzu. - tokio — eine asynchrone Laufzeitumgebung, die für die asynchrone Arbeit von reqwest erforderlich ist.
- serde und serde_json — für die Arbeit mit JSON-Strukturen.
Führen Sie nach dem Hinzufügen der Abhängigkeiten cargo build aus, um alle Bibliotheken herunterzuladen und zu kompilieren.
2. Einfache GET-Anfrage
Beginnen wir mit einer einfachen GET-Anfrage an eine öffentliche API. Erstellen wir eine Struktur für die Antwort und führen eine Anfrage an den JSONPlaceholder-Dienst durch:
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(())}Lassen Sie uns den Code erklären:
- Das Attribut
#[derive(Debug, Deserialize)]generiert automatisch Traits für die Ausgabe und Deserialisierung. #[tokio::main]wandelt die Funktion in einen asynchronen Einstiegspunkt um.reqwest::get()führt eine GET-Anfrage aus, und.awaitwartet auf deren Abschluss.response.json()wandelt die JSON-Antwort in unsere Struktur um.
Führen Sie den Code mit dem Befehl cargo run aus. Sie sehen die Beitragsdaten in der Konsole.
3. POST-Anfrage mit Datensendung
Sehen wir uns nun an, wie Daten an den Server gesendet werden. Für eine POST-Anfrage müssen wir eine Struktur für die zu sendenden Daten erstellen und die Methode post() verwenden:
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: "Mein erster Beitrag in Rust".to_string(), body: "Dies ist der Text des Beitrags, gesendet mit 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!("Beitrag mit ID erstellt: {}", created_post.id); println