Cliente HTTP para Rust: visão geral das melhores bibliotecas
Rust é uma linguagem de programação de sistemas que ganhou popularidade devido à segurança, desempenho e ausência de coletor de lixo. Ao desenvolver aplicações web, microsserviços ou ferramentas para trabalhar com APIs, surge frequentemente a necessidade de enviar requisições HTTP. Neste artigo, vamos analisar as melhores bibliotecas para trabalhar com HTTP em Rust, suas características, desempenho e exemplos de uso.
1. reqwest — o cliente HTTP mais popular
reqwest é um cliente HTTP de alto nível e conveniente para Rust, construído sobre hyper. Ele suporta requisições síncronas e assíncronas, processamento automático de JSON, cookies, proxy e TLS.
Principais funcionalidades:
- Suporte a async/await (requer tokio ou async-std)
- Serialização/desserialização automática de JSON (via serde)
- Trabalho com formulários, multipart, arquivos
- Gerenciamento de cookies e sessões
- Suporte a HTTP/2 e TLS (via native-tls ou rustls)
Exemplo de requisição GET com reqwest:
use reqwest;
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let response = reqwest::get("https://api.github.com/repos/rust-lang/rust") .await?;
let body = response.text().await?; println!("Resposta: {}", body); Ok(())}Exemplo de requisição POST com JSON:
use reqwest;use serde_json::json;
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let client = reqwest::Client::new(); let payload = json!({"title": "Nova tarefa", "completed": false});
let response = client .post("https://jsonplaceholder.typicode.com/todos") .json(&payload) .send() .await?;
println!("Status: {}", response.status()); Ok(())}2. ureq — minimalista e rápido
ureq é um cliente HTTP síncrono leve, sem dependências de runtime assíncrono. É ideal para scripts, utilitários CLI e projetos onde a assincronicidade não é necessária.
Características:
- API puramente síncrona
- Número mínimo de dependências
- Suporte a JSON, multipart, cookies
- Suporte embutido a TLS (via native-tls ou rustls)
Exemplo com ureq:
use ureq;
fn main() -> Result<(), ureq::Error> { let response = ureq::get("https://httpbin.org/get") .set("Accept", "application/json") .call()?;
let body: serde_json::Value = response.into_json()?; println!("JSON: {}", body); Ok(())}3. hyper — fundamento de baixo nível
hyper é uma biblioteca HTTP assíncrona sobre a qual muitos outros clientes são construídos (incluindo reqwest). Ela oferece controle total sobre as requisições, mas requer mais código e compreensão de conceitos assíncronos.
Quando escolher hyper:
- Quando for necessário o máximo desempenho
- Quando for necessário ajuste fino das conexões
- Quando você estiver construindo seu próprio servidor HTTP ou proxy
Exemplo de requisição GET simples com hyper:
use hyper::{Client, Uri};use hyper::body::HttpBody;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let client = Client::new(); let uri: Uri = "http://httpbin.org/ip".parse()?; let mut response = client.get(uri).await?;
while let Some(chunk) = response.body_mut().data().await { let data = chunk?; println!("{}", String::from_utf8_lossy(&data)); } Ok(())}4. actix-web-client — para o ecossistema Actix
actix-web-client é um