Notre première route avec Rocket

aeradriel

Thibaut Roche

Posted on September 6, 2022

Notre première route avec Rocket

Ajout de Rocket à notre projet

Bon, il est maintenant temps de se salir les mains et d'ajouter notre framework web à notre projet. Nous utiliserons Rocket car c'est à mon sens la crate la plus facile à appréhender et à mettre en place. Vous pouvez également consulter la crate actix-web qui peut être une très bonne alternative.
Pour les personnes n'étant pas familières avec le concept de crates, il s'agit de librairies (plugins, package...) permettant d'étendre les fonctionnalités du langage sans avoir besoin de réinventer la roue.

Si vous utilisez la crate cargo-edit vous pouvez simplement taper cargo add rocket dans votre terminal. Sinon, ajoutez simplement la version à votre fichier Cargo. Pour cet article, nous utiliserons la version 0.5.0-rc.2. Votre Cargo.toml devrait maintenant ressembler à ça :

[package]
name = "web_server"
version = "0.1.0"
edition = "2021"

[dependencies]
rocket = "0.5.0-rc.2"
Enter fullscreen mode Exit fullscreen mode

On est paré ! Commençons à coder.

Créons notre première route

Mettre en place un serveur web en Rust avec Rocket est vraiment (très) simple. Qui a dit que le Rust était seulement un langage de bas niveau ?

Remplaçons le contenu de notre main.rs et voyons ce que ça donne.

#[macro_use]
extern crate rocket;

#[get("/health")]
fn healthcheck() -> &'static str {
    "OK"
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![healthcheck])
}
Enter fullscreen mode Exit fullscreen mode

Les deux premières lignes nous permettent d'utiliser les macros de Rocket telles que get ou launch. Vous devriez être familier avec ça si vous avez déjà fait du Rust. Vous pouvez aussi décider de retirer ces lignes et n'importer que les macros dont vous avez besoin.

La macro get transforme notre simple fonction en un endpoint pour notre API. Elle prend en paramèter une string qui correspond au chemin de notre endpoint (à noter que cette route peut être préfixée comme nous le verrons ci-après). Ce n'est évidemment pas la seule macro de ce type et il en existe d'autres correspondant à tous les verbes HTTP.

Notez qu'une route peut retourner n'importe quel type implémentant le trait Responder. Il est déjà implémenté pour certains types tels que &str, String, ou encore Json mais vous pouvez aussi l'implémenter pour vos propres types. Je vous encourage à aller consulter cette page si vous souhaitez en savoir plus sur le trait Responder et les réponses en général.

Finalement, la macro launch génère une fonction main qui appelle la fonction launch de la structure retournée par la fonction à laquelle la macro est appliquée. En l'occurrence, le code généré serait le suivant :

#[rocket::main]
async fn main() {
    let _ = rocket().launch().await;
}
Enter fullscreen mode Exit fullscreen mode

Enfin, en ce qui concerne la fonction rocket() elle-même, elle se contente de monter les routes transmises en paramètre, préfixées du chemin indiqué. Notez qu'il est tout à fait possible d'appeler plusieurs fois la fonction mount si l'on souhaite monter différentes routes avec différents préfixes (nous aurons l'occasion d'y revenir plus tard dans cette série d'articles).

Nous pouvons maintenant lancer le serveur en tapant la commande cargo run dans notre terminal et voir les lignes suivantes nous indiquant que le serveur a démarré avec succès.

Configured for debug.
   >> address: 127.0.0.1
   >> port: 1234
   >> workers: 8
   >> ident: Rocket
   >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB
   >> temp dir: C:\Users\Thibaut\AppData\Local\Temp\
   >> http/2: true
   >> keep-alive: 5s
   >> tls: disabled
   >> shutdown: ctrlc = true, force = true, grace = 2s, mercy = 3s
   >> log level: debug
   >> cli colors: true
Routes:
   >> (healthcheck) GET /health
Fairings:
   >> Shield (liftoff, response, singleton)
registering event source with poller: token=Token(0), interests=READABLE | WRITABLE
Shield:
   >> X-Frame-Options: SAMEORIGIN
   >> Permissions-Policy: interest-cohort=()
   >> X-Content-Type-Options: nosniff
Rocket has launched from http://127.0.0.1:1234
Enter fullscreen mode Exit fullscreen mode

Rendez-vous dans votre navigateur à l'adresse indiquée (en n'oubliant pas d'y ajouter le chemin de notre endpoint) et vous devriez voir le contenu souhaité à savoir "OK".

Changer la configuration avec le ficher Rocket.toml

Vous souhaitez peut-être configurer votre serveur Rocket pour qu'il se lance sur un port différent, avec un niveau de log plus ou moins élevé ou encore changer le nombre de workers ? Peut-être souhaitez vous aussi avoir des configurations différentes dépendamment des environnements dans lesquels sont déployés l'application ? Bonne nouvelle, le fichier Rocket.toml est là pour ça.

Dans ce fichier, vous pouvez spécifier comment lancer votre serveur et configurer celui-ci par profil. Vous pouvez aussi avoir des configurations par défaut ou au contraire des configurations écrasant toutes les autres valeurs.

Voici une exemple de configuration. Vous pouvez trouver tous les champs disponibles dans la documentation.

[debug]
address = "127.0.0.1"
port = 1234
log_level = "debug"
Enter fullscreen mode Exit fullscreen mode

Dans le prochain article, nous irons un peu plus loin en ajoutant un système d'authentification à notre serveur !

💖 💪 🙅 🚩
aeradriel
Thibaut Roche

Posted on September 6, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Notre première route avec Rocket
rust Notre première route avec Rocket

September 6, 2022