Cliente HTTP en Rust: haciendo solicitudes correctamente
Rust es un lenguaje de programación de sistemas moderno que ha ganado popularidad gracias a su rendimiento y seguridad de memoria. Sin embargo, muchos desarrolladores acostumbrados a Python o JavaScript se preguntan: ¿cómo realizar solicitudes HTTP en Rust? En este artículo analizaremos la creación de un cliente HTTP en Rust utilizando la popular biblioteca reqwest. Aprenderá cómo hacer solicitudes GET y POST, procesar JSON, gestionar encabezados y trabajar con asincronía. Después de leerlo, podrá integrar con confianza un cliente HTTP en sus proyectos Rust.
1. Instalación y configuración del entorno
Para empezar, crearemos un nuevo proyecto Rust y añadiremos las dependencias necesarias. Abra la terminal y ejecute:
cargo new http_client_rustcd http_client_rustAhora edite el archivo Cargo.toml añadiendo las siguientes dependencias:
[dependencies]reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"Analicemos cada biblioteca:
- reqwest — el cliente HTTP principal. La bandera
jsonañade soporte para serialización/deserialización JSON. - tokio — el runtime asíncrono necesario para que reqwest funcione en modo asíncrono.
- serde y serde_json — para trabajar con estructuras JSON.
Después de añadir las dependencias, ejecute cargo build para descargar y compilar todas las bibliotecas.
2. Solicitud GET básica
Empecemos con una solicitud GET simple a una API pública. Crearemos una estructura para la respuesta y realizaremos la solicitud al servicio JSONPlaceholder:
use reqwest;use serde::Deserialize;
#[derive(Debug, Deserialize)]struct Post { userId: u32, id: u32, title: String, body: String,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let url = "https://jsonplaceholder.typicode.com/posts/1"; let response = reqwest::get(url).await?; let post: Post = response.json().await?; println!("{:#?}", post); Ok(())}Analicemos el código:
- El atributo
#[derive(Debug, Deserialize)]genera automáticamente los traits para impresión y deserialización. #[tokio::main]convierte la función en un punto de entrada asíncrono.reqwest::get()realiza la solicitud GET, y.awaitespera su finalización.response.json()transforma la respuesta JSON en nuestra estructura.
Ejecute el código con el comando cargo run. Verá los datos del post en la consola.
3. Solicitud POST con envío de datos
Ahora analicemos cómo enviar datos al servidor. Para una solicitud POST necesitaremos crear una estructura para los datos a enviar y usar el método post():
use reqwest::Client;use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize)]struct NewPost { title: String, body: String, userId: u32,}
#[derive(Debug, Deserialize)]struct CreatedPost { id: u32, title: String, body: String, userId: u32,}
#[tokio::main]async fn main() -> Result<(), reqwest::Error> { let client = Client::new(); let new_post = NewPost { title: "Mi primer post en Rust".to_string(), body: "Este es el cuerpo del post enviado con reqwest".to_string(), userId: 1, }; let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?; let created_post: CreatedPost = response.json().await?; println!("Post creado con ID: {}", created_post.id); println
```