Cliente HTTP para Rust: visão geral das melhores bibliotecas
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar serviços web, microsserviços e ferramentas para trabalhar com rede. A escolha do cliente HTTP correto é crítica para desempenho, segurança e facilidade de desenvolvimento. Neste artigo, examinaremos as três bibliotecas mais populares para executar requisições HTTP no ecossistema Rust: reqwest, ureq e hyper. Cada uma delas tem seus pontos fortes e é adequada para diferentes cenários.
1. Reqwest — escolha versátil
Reqwest é, talvez, a biblioteca mais popular para requisições HTTP em Rust. Ela é construída sobre hyper e fornece uma API de alto nível e ergonômica. Suporta tanto requisições assíncronas (via tokio) quanto síncronas (com a ativação da flag correspondente).
Principais características:
- Modos assíncrono e síncrono.
- Tratamento automático de redirecionamentos.
- Trabalho com JSON (serialização/desserialização via
serde). - Suporte a cookies, proxy, TLS.
- Trabalho conveniente com formulários e dados multipart.
Exemplo de requisição GET assíncrona:
use reqwest;use serde::Deserialize;
#[derive(Deserialize, Debug)]struct ApiResponse { userId: u32, id: u32, title: String, completed: bool,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let url = "https://jsonplaceholder.typicode.com/todos/1"; let response: ApiResponse = reqwest::get(url) .await? .json() .await?;
println!("{:#?}", response); Ok(())}Este exemplo mostra como é fácil executar uma requisição GET e desserializar a resposta JSON em uma estrutura. Reqwest é ideal para a maioria dos projetos: desde scripts simples até grandes aplicações web.
2. Ureq — minimalismo e simplicidade
Ureq é um cliente HTTP leve e síncrono. Sua principal vantagem é o número mínimo de dependências e a ausência da necessidade de um runtime assíncrono. Você simplesmente adiciona a crate e a usa. É excelente para utilitários CLI, scripts e situações onde a assincronia não é necessária.
Principais características:
- API totalmente síncrona (bloqueante).
- Número mínimo de dependências (não requer
tokio). - Suporte integrado a JSON e cookies.
- Trabalho simples com cabeçalhos e parâmetros.
Exemplo de requisição POST com JSON:
use ureq;use serde::Serialize;
#[derive(Serialize)]struct NewTodo { title: String, completed: bool,}
fn main() -> Result<(), ureq::Error> { let todo = NewTodo { title: "Estudar Rust".into(), completed: false, };
let response = ureq::post("https://jsonplaceholder.typicode.com/todos") .set("Content-Type", "application/json") .send_json(&todo)?;
let status = response.status(); let body = response.into_string()?; println!("Status: {}, Body: {}", status, body); Ok(())}Ureq perdoa erros de iniciantes e permite prototipar rapidamente. No entanto, não é adequado para sistemas assíncronos de alta carga.
3. Hyper — fundamento do ecossistema
Hyper é uma biblioteca assíncrona de baixo nível sobre a qual reqwest e muitas outras crates são construídas. Ela oferece controle total sobre a conexão HTTP, mas requer mais código e compreensão de programação assíncrona. É usada em sistemas de produção onde o desempenho é crítico (por exemplo, em bancos de dados ou servidores proxy).
Principais características:
- Assincronia baseada em
tokio. - Controle total sobre cada aspecto da requisição.
Também na biblioteca
Monitoramento de aplicações C# (.NET) com AppMetrics
Trabalho com CSV em PHP: leitura, escrita e processamento de dados
Configuração de aplicações em C++: bibliotecas e ferramentas para configuração flexível