Cliente HTTP para Rust: revisión de las mejores bibliotecas
Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para crear servicios web, microservicios y herramientas para trabajar con redes. Elegir el cliente HTTP correcto es fundamental para el rendimiento, la seguridad y la facilidad de desarrollo. En este artículo, analizaremos las tres bibliotecas más populares para realizar solicitudes HTTP en el ecosistema de Rust: reqwest, ureq y hyper. Cada una tiene sus puntos fuertes y es adecuada para diferentes escenarios.
1. Reqwest: la opción universal
Reqwest es, probablemente, la biblioteca más popular para solicitudes HTTP en Rust. Está construida sobre hyper y proporciona una API de alto nivel y ergonómica. Admite tanto solicitudes asíncronas (a través de tokio) como síncronas (activando la bandera correspondiente).
Características clave:
- Modos asíncrono y síncrono.
- Manejo automático de redirecciones.
- Trabajo con JSON (serialización/deserialización a través de
serde). - Soporte para cookies, proxies, TLS.
- Manejo conveniente de formularios y datos multipart.
Ejemplo de solicitud GET así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 ejemplo muestra lo fácil que es realizar una solicitud GET y deserializar la respuesta JSON en una estructura. Reqwest es ideal para la mayoría de los proyectos: desde scripts simples hasta grandes aplicaciones web.
2. Ureq: minimalismo y simplicidad
Ureq es un cliente HTTP ligero y síncrono. Su principal ventaja es la cantidad mínima de dependencias y la ausencia de la necesidad de un runtime asíncrono. Simplemente agregas el crate y lo usas. Es perfecto para utilidades CLI, scripts y situaciones donde no se necesita asincronía.
Características clave:
- API completamente síncrona (bloqueante).
- Cantidad mínima de dependencias (no requiere
tokio). - Soporte integrado para JSON y cookies.
- Trabajo simple con cabeceras y parámetros.
Ejemplo de solicitud POST con JSON:
use ureq;use serde::Serialize;
#[derive(Serialize)]struct NewTodo { title: String, completed: bool,}
fn main() -> Result<(), ureq::Error> { let todo = NewTodo { title: "Aprender 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 perdona los errores a los principiantes y permite prototipar rápidamente. Sin embargo, no es adecuado para sistemas asíncronos de alta carga.
3. Hyper: el fundamento del ecosistema
Hyper es una biblioteca asíncrona de bajo nivel sobre la que se construyen reqwest y muchos otros crates. Proporciona control total sobre la conexión HTTP, pero requiere más código y comprensión de la programación asíncrona. Se utiliza en sistemas de producción donde el rendimiento es crítico (por ejemplo, en bases de datos o servidores proxy).
Características clave:
- Asincronía basada en
tokio. - Control total sobre cada aspecto de la solicitud.
También en la biblioteca
Aprendizaje automático en C# (.NET): revisión de bibliotecas y herramientas
Envío de correo electrónico en Kotlin: bibliotecas y ejemplos de código
Trabajo con Excel en Go (Golang): bibliotecas exelize y tealeg/xlsx
RxSwift para Swift: guía completa con ejemplos