Cliente HTTP en Rust: haciendo solicitudes correctamente

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
```html

Cliente HTTP en Rust: haciendo solicitudes correctamente



Rust es un lenguaje de programación de sistemas moderno que combina el rendimiento de C++ con la seguridad de la memoria. Al desarrollar aplicaciones web, microservicios o herramientas de línea de comandos, a menudo surge la necesidad de interactuar con APIs externas. En este artículo, analizaremos cómo crear un cliente HTTP en Rust utilizando los populares crates reqwest y ureq. Aprenderás cómo enviar solicitudes GET y POST, manejar errores y trabajar con JSON.



¿Por qué Rust para solicitudes HTTP?



Rust ofrece ventajas únicas para trabajar con redes:



  • Seguridad de memoria — el compilador garantiza la ausencia de fugas y condiciones de carrera en los datos.
  • Alto rendimiento — velocidad comparable a C/C++.
  • Asincronía — soporte integrado para async/await para un trabajo eficiente con I/O.
  • Ecosistema de crates — miles de bibliotecas listas, incluyendo clientes HTTP.


Para trabajar con HTTP en Rust, existen dos enfoques principales: síncrono (bloqueante) y asíncrono (no bloqueante). Revisaremos ambos.



Configuración del proyecto y elección del crate



Creemos un nuevo proyecto en Rust:



cargo new rust-http-clientcd rust-http-client


Abra Cargo.toml y agregue las dependencias:



[dependencies]# Para solicitudes asíncronasreqwest = { version = "0.12", features = ["json"] }tokio = { version = "1", features = ["full"] }

# Para solicitudes síncronas (alternativa)ureq = "2.9"


Comparación de crates:



  • reqwest — el cliente HTTP más popular. Soporta asincronía, JSON, cookies, proxies.
  • ureq — un cliente síncrono ligero. Ideal para scripts simples y herramientas CLI.


1. Solicitud GET con reqwest (asíncrono)



Empecemos con una solicitud GET asíncrona. Cree el archivo src/main.rs:



use reqwest;use std::error::Error;

#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // Enviamos una solicitud GET let response = reqwest::get("https://api.github.com/repos/rust-lang/rust") .await? .text() .await?;

println!("Respuesta de la API de GitHub:"); println!("{}", &response[..500]); // Mostramos los primeros 500 caracteres

Ok(())}


Explicación:



  • #[tokio::main] — macro para iniciar el runtime asíncrono Tokio.
  • reqwest::get() — envía una solicitud GET y devuelve una Response.
  • .await? — espera a que la operación termine y maneja errores.
  • .text() — extrae el cuerpo de la respuesta como una cadena.


Ejecute el proyecto:



cargo run


Verá la respuesta JSON de la API de GitHub.



2. Solicitud POST con JSON (reqwest)



Ahora enviemos una solicitud POST con un cuerpo en formato JSON:



use reqwest;use serde::{Deserialize, Serialize};use std::error::Error;

#[derive(Serialize, Deserialize, Debug)]struct Post { title: String, body: String, user_id: u32,}

#[derive(Deserialize, Debug)]struct CreatedPost { id: u32, title: String,}

#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // Creamos un cliente con configuraciones let client = reqwest::Client::new();

// Datos para enviar let new_post = Post { title: "Cliente HTTP en Rust".to_string(), body: "Guía completa para trabajar con HTTP en Rust".to_string(), user_id: 1, };

// Enviamos una solicitud POST let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?;

// ```

Blogs

Book Recommendations