Cliente HTTP para Rust: revisión de las mejores bibliotecas
Rust es un lenguaje de programación de sistemas que está ganando popularidad en el desarrollo web y la creación de servicios de alta carga. Una de las tareas clave de cualquier aplicación de red es el envío de solicitudes HTTP. En este artículo, revisaremos las mejores bibliotecas para trabajar con HTTP en Rust, sus características, rendimiento y ejemplos de uso. El material será útil tanto para principiantes como para desarrolladores experimentados que eligen una herramienta para su proyecto.
1. reqwest — la opción universal
reqwest es la biblioteca HTTP más popular en el ecosistema de Rust. Está construida sobre hyper y tokio, pero proporciona una API de alto nivel y ergonómica. Soporta tanto el modo asíncrono (por defecto) como el modo bloqueante (a través de la característica blocking).
Características clave:
- Solicitudes asíncronas y síncronas
- Procesamiento automático de JSON (serialización/deserialización mediante
serde) - Soporte para TLS, cookies, proxy
- Redirecciones y tiempos de espera
- Carga de archivos y multipart/form-data
Ejemplo de solicitud GET así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(())}Ejemplo de solicitud 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(())}Ventajas: gran comunidad, excelente documentación, flexibilidad. Desventajas: tamaño de binario relativamente grande, dependencia de tokio.
2. ureq — cliente síncrono minimalista
ureq es una biblioteca ligera y simple sin asincronía. Ideal para scripts, utilidades CLI y casos donde no se necesita tokio. Funciona "de fábrica" sin configuración de runtime.
Características:
- Solo solicitudes síncronas
- Cantidad mínima de dependencias
- Soporte para HTTPS, cookies, redirecciones
- JSON integrado (a través de la característica
json)
Ejemplo:
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(())}Ventajas: simplicidad, peso ligero, tiempo de compilación rápido. Desventajas: sin asincronía, capacidades limitadas para escenarios complejos.
3. hyper — base de bajo nivel
hyper es la biblioteca HTTP fundamental para Rust, sobre la cual se construyen reqwest y muchas otras. Proporciona control total sobre el protocolo, pero requiere más código y comprensión de la asincronía.
Cuándo usarlo: si necesita el máximo rendimiento, protocolos no estándar o está creando su propio framework HTTP.
Ejemplo de cliente simple:
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 = "