Datenvalidierung in Rust: Bibliotheken und Ansätze

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

Datenvalidierung in Rust: Überblick über Bibliotheken und praktische Ansätze



In der modernen Entwicklung mit Rust, insbesondere bei der Erstellung von Webdiensten und APIs, ist die Validierung eingehender Daten eine kritische Aufgabe. Die Sprache Rust bietet bereits ein mächtiges Typsystem, das ganze Fehlerklassen bereits zur Kompilierzeit ausschließt. Für die Überprüfung der Geschäftslogik (z. B. Mindestlänge eines Passworts, Korrektheit einer E-Mail, Zahlenbereich) sind jedoch zusätzliche Werkzeuge erforderlich. In diesem Artikel betrachten wir die drei beliebtesten Bibliotheken zur Datenvalidierung in Rust: validator, garde und valitron.



1. Die Bibliothek validator



validator ist wohl die bekannteste und ausgereifteste Bibliothek zur Validierung von Strukturen in Rust. Sie basiert auf Attributen (derive macros) und unterstützt eine Vielzahl integrierter Regeln.



Installation:

[dependencies]validator = { version = "0.18", features = ["derive"] }


Anwendungsbeispiel:

use validator::Validate;

#[derive(Debug, Validate)]struct User { #[validate(length(min = 3, max = 20))] username: String,

#[validate(email)] email: String,

#[validate(range(min = 18, max = 120))] age: u32,

#[validate(required)] password: Option<String>,}

fn main() { let user = User { username: "Jo".to_string(), email: "invalid-email".to_string(), age: 15, password: None, };

match user.validate() { Ok(_) => println!("Validierung bestanden!"), Err(errors) => { for (field, err) in &errors.errors() { println!("Fehler im Feld '{}': {:?}", field, err); } } }}


Vorteile:

  • Große Anzahl integrierter Validatoren: E-Mail, URL, Länge, Bereich, reguläre Ausdrücke.
  • Unterstützung für benutzerdefinierte Validierungsfunktionen über das Attribut custom.
  • Gute Integration mit Web-Frameworks (Actix-web, Axum, Rocket).


Nachteile:

  • Abhängig von Makros, was die Kompilierung verlangsamen kann.
  • Fehler werden als HashMap zurückgegeben, was eine zusätzliche Verarbeitung für die API erfordert.


2. Die Bibliothek garde



garde ist eine modernere und schnellere Alternative zu validator. Sie verwendet ebenfalls derive-Makros, bietet aber eine flexiblere API und eine bessere Leistung.



Installation:

[dependencies]garde = "0.20"


Anwendungsbeispiel:

use garde::Validate;

#[derive(Debug, Validate)]struct LoginRequest { #[garde(length(min = 3, max = 50))] username: String,

#[garde(ascii, length(min = 8))] password: String,

#[garde(skip)] remember_me: bool,}

fn main() { let req = LoginRequest { username: "ab".to_string(), password: "1234567".to_string(), remember_me: true, };

if let Err(errors) = req.validate() { for error in &errors { println!("Fehler: {} - {}", error.path(), error.message()); } } else { println!("Validierung erfolgreich!"); }}


Vorteile:

  • Hohe Leistung durch optimierten Code.
  • Klare Fehlermeldungen mit Pfad zum Feld.
  • Unterstützung für verschachtelte Strukturen und Sammlungen.
  • Möglichkeit, eigene Regeln ohne Makros zu erstellen.


Nachteile:

  • Weniger integrierte Validatoren (standardmäßig keine E-Mail, URL).
  • Kleinere Community als bei validator.


3. Die Bibliothek valitron



valitron ist eine leichte Bibliothek, die keine

Empfehlungen