Executando verificação de segurança...
12

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])
}
  1. Primeiro importamos todos os macros do rocket globalmente na primeira linha
  2. 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
  3. 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])
    }
    
  4. Dentro da função rocket criamos um app e montamos a nossa rota hello 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:
rota funcionando
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!

Carregando publicação patrocinada...
3

Cara, sensacional!

Sou dev Java, normalmente com o Spring e também uso bastante o typeScript seja com node no back ou usando ReactJs e NextJs no front. Mas cada vez mais venho me intessado pelo Rust, não sei por que mas quanto mais estudo sobre, mais o meu brilho no olho aumenta!

A velocidade, a sintaxe, a versatilidade e etc, me fazem cada vez mais olhar para rust e web assembly como o futuro da web, mas não sei se essa mudança na forma de se pensar web vai ter a aceitação nesseria para se consolidar... espero muito que sim rs.

Falando sobre o aprendizado do Rust, vejo muita gente falando do framework Yew também, entre outras coisa. Gostaria de saber se tem alguma dica para quem ja é dev e está querendo adicionar essa linguagem na .

2

Eu já tentei usar yew tambem, mas o problema é que demora pra compilar e o binario gerado demora uns 5 segundos pra baixar, mesmo em localhost, então eu usei svelte, porque o feedback é instantaneo.
o yew é como react, é um framework de frontend, para backend se usa coisas como rocket e actix.

1

Vou deixar aqui como referência, encontrei um repositório que compara a velocidade entre diferentes linguagens de programação, e para fazer um servidor web em Rust o autor deixou algumas observações:

Para a parte do servidor web, gastei algum tempo tentando decidir qual framework usar. Quando olhei pela última vez para Rust, o Rocket estava na moda, mas parece ter saído do radar quase completamente nos dias de hoje! Isso foi levemente preocupante. Parece que o Actix se tornou quase o "padrão", exceto que há um novo framework chamado axum que é bastante popular. Sendo parte do projeto oficial do Tokio, e achando que o Tokio tem poder de permanência, eu escolhi o axum.

1