Notre première route avec Rocket
Tags: rust, webdev, tutorial, rocket
Published: 2022-09-06 07:16:44

## 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](https://rocket.rs/) car c'est à mon sens la crate la plus facile à appréhender et à mettre en place. Vous pouvez également consulter la crate [actix-web](https://actix.rs/) 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 :

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

[dependencies]
rocket = "0.5.0-rc.2"
```

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.

```rust
#[macro_use]
extern crate rocket;
 
#[get("/health")]
fn healthcheck() -> &'static str {
    "OK"
}
 
#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![healthcheck])
}
```

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](https://api.rocket.rs/v0.4/rocket/index.html#attributes).

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](https://rocket.rs/v0.5-rc/guide/responses/) 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 :

```rust
#[rocket::main]
async fn main() {
    let _ = rocket().launch().await;
}
```

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
```

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](https://rocket.rs/v0.5-rc/guide/configuration/).

```
[debug]
address = "127.0.0.1"
port = 1234
log_level = "debug"
```

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