Rocket : un framework pour développer des applications web en Rust
ven, 21/12/2018 - 12:39
Si vous appréciez le langage Rust et si vous devez développer une application web, vous apprécierez probablement le framework Rocket.
Sur son site dédié, https://rocket.rs/ Rocket est présenté ainsi : Rocket se veut rapide, simple et flexible tout en offrant une sécurité garantie, là où il le peut. Rocket vise également à être plaisant, et il le fait en vous permettant d'écrire le moins de code possible pour accomplir votre tâche.
Le travail principal de Rocket consiste à acheminer les requêtes entrantes vers le gestionnaire de requêtes approprié à l'aide des itinéraires (routes) déclarés de votre application. Les routes sont déclarées en utilisant les attributs de routage de Rocket. Ces attributs décrivent les requêtes correspondant à l'itinéraire. L'attribut est placé au-dessus d'une fonction qui est le gestionnaire de requêtes pour cette route. Voici à titre d'exemple, un simple 'Hello World'
#[get("/")]
fn index () -> & 'static str {
"Helle World!"
}
Ici, la route, nommée index, correspondra aux requêtes GET (et uniquement GET) HTTP entrantes sur / l'URL racine de votre application. Le gestionnaire de requêtes retourne une chaîne. Rocket utilisera cette chaîne en tant que corps d'une réponse HTTP entièrement formée.
Très intéressant au niveau de la sécurité, Rocket valide une correspondance entre une requête entrante et son gestionnaire en s'assurant que tous les types pour un gestionnaire donnés peuvent être dérivés de la requête entrante. Si ce n'est pas le cas, une erreur est retournée. Par exemple :
#[post("/user", data = "<new_user>")]
fn new_user(admin: AdminUser, new_user: Form<User>) -> T {
...
}
Rocket fait les vérifications suivantes :
- La méthode de requête doit être POST.
- Le chemin (URL) de la requête doit être /user.
- La requête doit contenir data dans son corps.
- Les métadonnées de la demande doivent authentifier un AdminUser.
- Le corps de la demande doit être un formulaire qui se transforme en une structure User.
Autre exemple :
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
fn hello(name: String, age: u8) -> String {
format!("Hello, {} year old named {}!", age, name)
}
fn main() {
rocket::ignite().mount("/hello", routes![hello]).launch();
}
Le gestionnaire ci-dessous répond à la visite de l'URL localhost:8000/hello/John/58 qui déclenche la route (=appel de la fonction) 'hello'.
Pour la visite ci-dessus, localhost:8000/hello/John/58, la fonction retourne "Hello, 58 year old named John!" au navigateur. Tout va bien
Mais si par exemple la chaine <age> ne peut pas être parsée en un entier u8, la fonction 'hello' n'est pas appelée et une erreur 404 est retournée
Rocket n'est pour l'instant qu'en version 0.4, mais il est développé activement.
Rocket, qui de l'humble avis de votre serviteur mérite vraiment d'être découvert, est un logiciel libre sous licence Apache 2.0, disponible sur GitHub.
Commentaires
Yes rocket c'est TOP, il est léger (quelque ko en ram) et très efficace.
Petit Bémol, il nécessite la version nightly de rust, ce qui le rend parfois instable lors des mises à jour.
Il semblerait que les développeurs lui préfèrent actix car + stable et tout aussi performant selon le benchmark techempower.