Cliente HTTP em Rust: fazendo requisições corretamente do A ao Z

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

Introdução: Por que Rust é uma excelente escolha para requisições HTTP

\n

Rust é uma linguagem de programação de sistemas que ganhou popularidade devido à sua segurança, desempenho e ausência de coletor de lixo. Se você está desenvolvendo uma aplicação de rede, um web scraper ou um microsserviço, saber como fazer requisições HTTP corretamente em Rust é uma habilidade obrigatória. Neste artigo, vamos abordar como criar um cliente HTTP completo em Rust usando a biblioteca reqwest, que é o padrão de facto para trabalhar com HTTP no ecossistema Rust.

\n

Vamos percorrer o caminho desde a instalação das dependências até o tratamento de erros e o trabalho com JSON. Ao final do artigo, você será capaz de escrever clientes HTTP robustos e rápidos em Rust que não falharão em produção.

\n\n

Instalação e configuração do projeto

\n

O primeiro passo é criar um novo projeto e adicionar a dependência reqwest com suporte a assincronia e JSON.

\n
cargo new rust_http_client\ncd rust_http_client
\n

Abra o Cargo.toml e adicione:

\n
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"
\n

Vamos explicar cada dependência:

\n
    \n
  • reqwest — o cliente HTTP principal. A flag json ativa o suporte para serialização/desserialização.
  • \n
  • tokio — o runtime assíncrono do Rust. As requisições HTTP no reqwest são assíncronas por padrão.
  • \n
  • serde / serde_json — para trabalhar com JSON (estruturas, serialização).
  • \n
\n

Agora está tudo pronto para escrever o código.

\n\n

Requisição GET básica: obtendo dados do servidor

\n

Vamos começar com uma requisição GET simples. Criaremos uma função que obtém dados de uma API pública e os exibe no console.

\n
use reqwest::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    let url = "https://jsonplaceholder.typicode.com/posts/1";\n    let response = reqwest::get(url).await?;\n\n    println!("Status: {}", response.status());\n\n    let body = response.text().await?;\n    println!("Corpo da resposta:\\n{}", body);\n\n    Ok(())\n}
\n

O que está acontecendo aqui:

\n
    \n
  • Usamos o macro #[tokio::main] para executar a função assíncrona.
  • \n
  • reqwest::get(url).await? executa a requisição GET. O sinal ? propaga o erro se a requisição falhar.
  • \n
  • response.status() retorna o status HTTP (por exemplo, 200 OK).
  • \n
  • response.text().await? extrai o corpo da resposta como uma string.
  • \n
\n

Execute o código com o comando cargo run. Você verá um objeto JSON com os dados do post.

\n\n

Adicionando cabeçalhos e parâmetros de requisição

\n

Em aplicações reais, muitas vezes é necessário passar cabeçalhos (por exemplo, chave de API) ou parâmetros de consulta. Veja como fazer isso:

\n
use reqwest::Client;\nuse std::collections::HashMap;\n\n#[tokio::main]\nasync fn main() -> Result<(), reqwest::Error> {\n    let client = Client::new();\n\n    let mut params = HashMap::new();\n    params.insert("userId", "1");\n\n    let response = client\n        .get("https://jsonplaceholder.typicode.com/posts")\n        .header("Accept", "application/json")\n        .query(&params)\n        .send()\n        .await?;\n\n    let posts: serde_json::Value = response.json().await?;\n    println!("Número de posts: {}", posts.as_array().unwrap().len());\n\n    Ok(())\n}
\n

Pontos-chave:

\n
    \n
  • Criamos um Client — este é um cliente HTTP reutilizável com um pool de conexões. Sempre use Client em vez de chamadas diretas a reqwest::get para código em produção.
  • \n
  • O método .header() adiciona um cabeçalho.
  • \n
  • .query() aceita um dicionário de parâmetros e codifica a URL automaticamente.
  • \n
  • .json() desserializa imediatamente

Blogs

Book Recommendations