Criando um web app simples em Rust usando o rocket
Primeiro, muito obrigado pelo apoio nos ultimos posts sobre rust 😄!
Hoje eu quero mostrar como criar uma API extremamente rapida de um jeito muito facil em rust usando o framework rocket.
Porquê fazer uma API em rust?
- Velocidades muito boas
- Tipagem forte
- Injeções são muito mais raras por causa da tipagem forte
Primeiro servidor
Como todos os projetos criamos o novo projeto usando cargo new <nome>
:
Created binary (application) `my_rocket_app` package
Mudando para o canal nightly
do rust
Antes de podermos usar o rocket, ele precisa do canal nightly
do rust, esse canal é compilado todas as noites no GitHub actions, por isso o nome nightly
, entenda canais do rust como branches de git.
O rocket precisa desse canal para usar algumas funcionalidades instáveis/novas do rust que ainda não estão no canal stable
.
Para isso vamos criar um arquivo rust-toolchain.toml
dentro do novo projeto:
[toolchain]
channel = "nightly"
Hello world com rocket 🚀
Agora, precisamos adicionar a dependência do rocket dentro do nosso projeto. Todas as dependencias são declaradas dentro do arquivo Cargo.toml. A versão mais recente no momento que estou escrevendo é 0.5.0-rc.2
.
[package]
name = "my_rocket_app"
version = "0.1.0"
edition = "2021"
[dependencies]
rocket = "0.5.0-rc.2"
Se executar o comando cargo build
, irá perceber que ele vai baixar e compilar o rocket como esperado, mas se rodarmos ainda veremos o hello world.
Vamos criar um app rocket agora!
#[macro_use] extern crate rocket;
#[get("/hello/<name>/<age>")]
fn hello(name: &str, age: u8) -> String {
format!("Hello, {} year old named {}!", age, name)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![hello])
}
- Primeiro importamos todos os macros do rocket globalmente na primeira linha
- Criamos uma função anotada com o macro
#[get("...")]
do rocket especificando a rota
O macro#[get("...")]
define uma rota GET com a string passada como parametro - Depois criamos uma função chamada
rocket
anotada com o macro#[launch]
Isso é apenas um açucar sintatico para:// ... use rocket::tokio; use rocket::{Rocket, Build}; #[rocket::main] async fn main() { let _ = rocket().launch().await; } fn rocket() -> Rocket<Build> { rocket::build().mount("/", routes![hello]) }
- Dentro da função
rocket
criamos um app e montamos a nossa rotahello
em/
Facil né? Vamos rodar!
Compiling my_rocket_app v0.1.0 (/home/tiago/Documentos/my_rocket_app)
Finished dev [unoptimized + debuginfo] target(s) in 44.70s
Running `target/debug/my_rocket_app`
🔧 Configured for debug.
>> address: 127.0.0.1
>> port: 8000
>> workers: 4
>> ident: Rocket
>> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB
>> temp dir: /tmp
>> http/2: true
>> keep-alive: 5s
>> tls: disabled
>> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s
>> log level: normal
>> cli colors: true
📬 Routes:
>> (hello) GET /hello/<name>/<age>
📡 Fairings:
>> Shield (liftoff, response, singleton)
🛡️ Shield:
>> X-Frame-Options: SAMEORIGIN
>> X-Content-Type-Options: nosniff
>> Permissions-Policy: interest-cohort=()
🚀 Rocket has launched from http://127.0.0.1:8000
Se digitarmos http://localhost:8000/hello/coffee-is-power/15
no navegador vamos ver:
Agora você tem um web app simples em rocket 🚀!
Conclusão
Nesse post criamos um app simples em rust usando o framework rocket, ainda tem muita coisa que pode ser feita que eu quero mostrar, mas se não esse post ficaria do tamanho de um livro.
Atualmente estou criando um registro de plugins pra o editor de texto Lapce em rocket e svelte rodando na heroku, a minha experiência está sendo ótima! Desejo tudo de bom para vocês e para os desenvolvedores do rocket! Até a proxima!