Saltar al contenido

La capa de red completa

Todo lo de este nivel en un solo módulo: cliente reutilizado, destinos tipados, testigo por destino, reintentos, límites y errores que distinguen las causas.

Los destinos, tipados

La pieza que cierra el nivel 48.2 por construcción:

Rust
pub enum Destino {    ProyectosRecientes { limite: u32 },    Proyecto { id: ProyectoId },    SubirAdjunto { proyecto: ProyectoId },    RefrescarSesion,}impl Destino {    fn url(&self, base: &Url) -> Url { /* … */ }    fn metodo(&self) -> Method { /* … */ }    fn lleva_testigo(&self) -> bool { !matches!(self, Destino::RefrescarSesion) }    fn se_puede_reintentar(&self) -> bool { self.metodo().is_safe() }}

Cuatro propiedades por destino, decididas una vez: la URL, el método, si lleva credenciales —nivel 48.2— y si es seguro reintentarlo.

La última es la que evita el error de reintentar una operación que ya se aplicó: reintentar una lectura es gratis; reintentar una escritura puede duplicarla.

Reintentar con criterio

Y la espera creciente con algo de aleatoriedad: si mil clientes reintentan a la vez tras una caída, sincronizados, tumban el servidor al volver. Añadir una variación aleatoria a cada espera lo evita, y son dos líneas.

Los errores que la interfaz necesita

No un tipo genérico, sino los casos que producen respuestas distintas:

Rust
pub enum ErrorRed {    SinConexion,                    // «sin conexión» — nivel 48.3    TiempoAgotado,                  // «está tardando; ¿reintentar?»    NoAutorizado,                   // pedir credenciales — nivel 38.4    Servidor { codigo: u16 },       // «algo va mal en el servicio»    Certificado,                    // el mensaje del nivel 48.4    Aplicacion { mensaje: String }, // lo que tu servicio explique}

Cada variante lleva a una interfaz distinta, y ésa es la prueba de que la separación merece la pena: si dos variantes producen la misma pantalla, sobra una.

Los valores por omisión

Lo que la capa trae puesto sin que nadie lo pida:

El último punto merece cuidado: registrar peticiones es muy útil para diagnosticar y es la vía más común por la que un secreto acaba en un fichero de registro. Registrar el destino tipado —que no es una URL con parámetros— evita la mayor parte del problema por construcción.