Cliente HTTP para Rust: visão geral das melhores bibliotecas
Rust é uma linguagem de programação de sistemas que está ganhando popularidade no desenvolvimento web e na criação de serviços de alta carga. Uma das tarefas principais de qualquer aplicação de rede é o envio de requisições HTTP. Neste artigo, vamos analisar as melhores bibliotecas para trabalhar com HTTP em Rust, suas características, desempenho e exemplos de uso. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que estão escolhendo uma ferramenta para seu projeto.
1. reqwest — a escolha universal
reqwest é a biblioteca HTTP mais popular no ecossistema Rust. Ela é construída sobre hyper e tokio, mas oferece uma API de alto nível e ergonômica. Suporta tanto o modo assíncrono (padrão) quanto o modo bloqueante (através da feature blocking).
Principais recursos:
- Requisições assíncronas e síncronas
- Processamento automático de JSON (serialização/desserialização via
serde) - Suporte a TLS, cookies, proxy
- Redirecionamentos e timeouts
- Upload de arquivos e multipart/form-data
Exemplo de requisição GET assíncrona:
use reqwest;use serde::Deserialize;
#[derive(Deserialize, Debug)]struct User { id: u32, name: String, email: String,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let user: User = reqwest::get("https://jsonplaceholder.typicode.com/users/1") .await? .json() .await?; println!("{:?}", user); Ok(())}Exemplo de requisição POST bloqueante:
use reqwest::blocking::Client;use serde_json::json;
fn main() -> Result<(), reqwest::Error> { let client = Client::new(); let resp = client.post("https://httpbin.org/post") .json(&json!({"key": "value"})) .send()?; println!("Status: {}", resp.status()); Ok(())}Prós: enorme comunidade, excelente documentação, flexibilidade. Contras: tamanho relativamente grande do binário, dependência do tokio.
2. ureq — cliente síncrono minimalista
ureq é uma biblioteca leve e simples, sem assincronicidade. Ideal para scripts, utilitários CLI e casos onde não é necessário tokio. Funciona "pronto para uso" sem configuração de runtime.
Características:
- Apenas requisições síncronas
- Número mínimo de dependências
- Suporte a HTTPS, cookies, redirecionamentos
- JSON embutido (através da feature
json)
Exemplo:
use ureq;
fn main() -> Result<(), ureq::Error> { let body: String = ureq::get("https://api.github.com/repos/rust-lang/rust") .call()? .into_string()?; println!("{}", &body[..200]); Ok(())}Prós: simplicidade, leveza, tempo de compilação rápido. Contras: sem assincronicidade, recursos limitados para cenários complexos.
3. hyper — base de baixo nível
hyper é a biblioteca HTTP fundamental para Rust, sobre a qual reqwest e muitas outras são construídas. Ela oferece controle total sobre o protocolo, mas requer mais código e compreensão de assincronicidade.
Quando usar: se você precisa de desempenho máximo, protocolos não padrão ou está criando seu próprio framework HTTP.
Exemplo de cliente simples:
use hyper::{Client, Uri};use hyper::body::HttpBody as _;use tokio;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let client = Client::new(); let uri: Uri = "