Como escrever uma API REST em Rust em 30 minutos: guia prático

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
Here's the translated HTML blog article in Brazilian Portuguese:

Introdução: Por que Rust para REST API?

Rust é uma linguagem de programação de sistemas moderna que combina o desempenho do C++ com segurança de memória. Nos últimos anos, tem sido ativamente usada para construir serviços web de alta carga e REST APIs. Neste guia, criaremos uma REST API completa em Rust usando o framework Actix-web em 30 minutos.

Por que escolher Rust para REST API?

  • Desempenho: Rust compila para código nativo e não usa um coletor de lixo, proporcionando velocidade máxima de processamento de requisições.
  • Segurança: O sistema de ownership e borrowing elimina classes inteiras de erros relacionados à memória.
  • Escalabilidade: Actix-web é um dos frameworks web mais rápidos do mundo, capaz de lidar com milhões de requisições por segundo.

Ao final deste artigo, você terá um projeto pronto com vários endpoints, tratamento de erros e uma estrutura para expansão futura.



Passo 1: Configuração do Projeto e Instalação de Dependências

Primeiro, vamos criar um novo projeto Cargo. Abra seu terminal e execute:

cargo new rust_rest_apicd rust_rest_api

Agora abra o arquivo Cargo.toml e adicione as seguintes dependências:

[dependencies]actix-web = "4"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1", features = ["full"] }uuid = { version = "1.0", features = ["v4", "serde"] }

Vamos detalhar o que cada biblioteca faz:

  • actix-web — o framework web principal para criar um servidor HTTP.
  • serde / serde_json — serialização e desserialização de dados no formato JSON.
  • tokio — um runtime assíncrono necessário para o funcionamento do Actix.
  • uuid — geração de identificadores únicos para nossas entidades.

Execute cargo build para baixar todas as dependências. Isso levará algum tempo na primeira execução.



Passo 2: Criando o Modelo de Dados e Armazenamento

Nossa API gerenciará uma lista de tarefas (um aplicativo TODO). Vamos criar um modelo simples. Abra src/main.rs e adicione o seguinte código:

use actix_web::{web, App, HttpServer, HttpResponse, middleware::Logger};use serde::{Deserialize, Serialize};use std::sync::Mutex;use uuid::Uuid;

// Modelo de Tarefa#[derive(Debug, Serialize, Deserialize, Clone)]struct Task { id: Uuid, title: String, completed: bool,}

// Requisição para criar uma tarefa#[derive(Debug, Deserialize)]struct CreateTaskRequest { title: String,}

// Armazenamento de tarefas (em memória)struct AppState { tasks: Mutex>,}

Usamos Mutex para acesso thread-safe aos dados. Em um projeto real, você substituiria isso por um banco de dados, mas esta opção funciona para fins de demonstração.

Agora vamos adicionar uma função para inicializar o estado da aplicação:

fn init_tasks() -> Vec {    vec![        Task {            id: Uuid::new_v4(),            title: "Aprender Rust".to_string(),            completed: false,        },        Task {            id: Uuid::new_v4(),            title: "Escrever REST API".to_string(),            completed: true,        },    ]}


Passo 3: Implementando Endpoints CRUD

Agora vamos criar os handlers principais para nossa REST API. Adicione o seguinte código após as declarações do modelo:



GET /tasks — obter uma lista de todas as tarefas

async fn get_tasks(data: web::Data<AppState>) -> HttpResponse {    let tasks = data.tasks.lock().unwrap();    HttpResponse::Ok().json(tasks.clone())}


POST /tasks — criar uma nova tarefa

async fn create_task(    data: web::Dat

Blogs

Book Recommendations