Nueva Historia

Código Olor 303 - Cómo evitar la ruptura de los clientes existentes cuando haces cambios

por Maximiliano Contieri5m2025/06/13
Read on Terminal Reader

Demasiado Largo; Para Leer

Debe actualizar sus APIs para evitar romper los clientes existentes cuando realice cambios
featured image - Código Olor 303 - Cómo evitar la ruptura de los clientes existentes cuando haces cambios
Maximiliano Contieri HackerNoon profile picture

Cuando rompes las APIs sin aviso, rompes la confianza

TL;DR: Debe versionar sus APIs para evitar romper los clientes existentes cuando realice cambios.

TL;DR: Debe versionar sus APIs para evitar romper los clientes existentes cuando realice cambios.

Problemas

  • Aplicaciones de cliente se despliegan
  • Fracaso de la integración
  • La violación del principio de la mínima sorpresa
  • Downtime
  • La confianza quebrada
  • Requiere rollbacks de despliegue
  • Tiempo de desarrollo perdido
  • Degradación de la experiencia del usuario

Soluciones

  1. Introducción a la versión semántica
  2. Introducción a la compatibilidad retroactiva
  3. Create deprecation warnings
  4. Creación de Roadmaps
  5. Uso de la negociación de contenidos
  6. Versiones paralelas
  7. Comunicar los cambios temprano
  8. Desaparece gradualmente las características
  9. Documentos que rompen los cambios claramente
  10. Comprobar los parámetros deprecados con logging
  11. Prueba de nuevas versiones
  12. Eliminar la funcionalidad degradada después del atardecer

Contexto

Cuando se modifican las APIs sin la versión correcta, se crean cambios revolucionarios que afectan a todos los clientes existentes.


Usted obliga a los consumidores a actualizar su código de inmediato o enfrentar fallos del sistema.


Usted rompe el contrato implícito entre los proveedores de API y los consumidores.


El software moderno depende en gran medida de la estabilidad de la API, y la introducción de cambios de brecha sin aviso puede crear fallas en cascada en sistemas dependientes.


Hoy es más importante que nunca desde entoncesmuchas IAs construyen sus soluciones utilizando la documentación API existente.


Cuando actualiza una API sin mantener la compatibilidad retroactiva, corre el riesgo de romper todas las aplicaciones que dependen de ella.


Esto crea inestabilidad, frustración y correciones costosas para los usuarios.


Los clientes a menudo tolerandefectosen nuevas funcionalidades, pero nunca un comportamiento estable previamente roto.


La versión correcta garantiza transiciones suaves y mantiene la fiabilidad de su sistema.

Código de muestreo

equivocado 🙂

// user-api-v1.json - Original API response
{
  "id": 317,
  "name": "Mr Nimbus",
  "email": "[email protected]",
  "nationalities": "Brazilian,Canadian,Oceanic"
}

// Later changed to this without versioning:
{
  "userId": 317,
  "fullName": "Mr Nimbus", 
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalities": ["Brazilian", "Canadian", "Oceanic"]
}

fetch('/api/users/317')
  .then(response => response.json())
  .then(user => {
    // This breaks when API changes field names and data types
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    // This breaks when nationalities changes from string to array
    document.getElementById('nationalities').textContent 
      = user.nationalities;
  });

Derecho

// user-api-v1.json - Version 1 (maintained)
{
  "id": 317,
  "name": "Mr Nimbus",
  "email": "[email protected]",
  "nationalities": "Brazilian,Canadian,Oceanic"
}

// user-api-v2.json - Version 2 
// (new structure, backward compatible)
{
  "id": 317,
  "userId": 317,
  "name": "Mr Nimbus",
  "fullName": "Mr Nimbus",
  "email": "[email protected]",
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalities": "Brazilian,Canadian,Oceanic"
  "nationalitiesList": ["Brazilian", "Canadian", "Oceanic"]
}

// user-api-v3.json - Version 3 
// (new structure, backward not compatible)
{
  "userId": 317,
  "fullName": "Mr Nimbus",
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalitiesList": ["Brazilian", "Canadian", "Oceanic"]
}

// client-code-versioned.js
const API_VERSION = 'v1';

fetch(`/api/${API_VERSION}/users/317`)
  .then(response => response.json())
  .then(user => {
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    // V1 handles comma-separated string
    document.getElementById('nationalities').textContent
      = user.nationalities;
  });

// Or with content negotiation
fetch('/api/users/317', {
  headers: {
    'Accept': 'application/vnd.api+json;version=1'
  }
})
  .then(response => response.json())
  .then(user => {
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    document.getElementById('nationalities').textContent 
      = user.nationalities;
  });

Detección

  • [x] Semi-automático

Puede detectar este olor cuando encuentra APIs que cambian nombres de campos, eliminan campos o alteran estructuras de datos sin mantener la compatibilidad retroactiva.


Busque aplicaciones cliente que se interrumpan después de las implementaciones de la API.


Compruebe los encabezados de versiones que faltan o los esquemas de versiones de URL.


Monitorear los registros de errores para picos repentinos en fallas del cliente después de las ediciones.

Tags ️

  • APIS

Nivel

  • [x] El Intermedio

¿Por qué es importante la bijeción ️

Debe mantenerse estableMapaentre su contrato de API y las expectativas del cliente.


Cuando rompas estoBijeciónAl cambiar la API sin versiones, viole el principio fundamental de que los clientes pueden confiar en interfaces consistentes.


Crea una discrepancia entre lo que los clientes esperan recibir y lo que proporciona su API.


Esto rompe la correspondencia uno a uno entre las promesas de API y la entrega de API, lo que lleva a fallos del sistema y pérdida de confianza.


Cuando rompe el mapeo entre su API y la lógica de negocio que representa, los clientes no pueden interactuar de manera confiable con su sistema.


Esta incompatibilidad conduce a defectos, tiempos de inactividad, falta de confianza y una mala experiencia del usuario.

La generación

Los generadores de IA a menudo crean este olor cuando se les pide "mejorar" o "actualizar" las APIs existentes.


Se centran en hacer la API "mejor" sin considerar la compatibilidad retroactiva.


Debe instruir explícitamente las herramientas de IA para mantener los nombres de campo existentes y agregar la versión al hacer cambios.


A menudo prefieren el diseño limpio sobre la estabilidad a menos queexplícitamenteDijo lo contrario.

Detección

Los generadores de IA pueden corregir este olor cuando proporciona instrucciones claras sobre las estrategias de versión de API.


Debe pedirles que implementen la versión semántica, mantengan la compatibilidad retroactiva y creen rutas de migración para características degradadas.

¡Pruébelo!

Recuerda: los asistentes de IA cometen muchos errores

Prompt sugerido: Crear la versión de la API para evitar cambios

Prompt sugerido: Crear la versión de la API para evitar cambios

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

ChatGPT

ChatGPT

Claude

Claude

Perplejidad

Perplejidad

piloto

piloto

Gemini

Gemini

profundidad

profundidad

El objetivo es

El objetivo es

Grúas

Grok

Quien

Quien

Conclusión

Siempre debe versionar sus APIs para evitar que los cambios de interrupción afecten a las aplicaciones del cliente.


Incluso desde su primera versión.


Cuando mantiene contratos estables a través de una correcta versión, crea confianza con los consumidores de API y permite una evolución suave de sus sistemas.


Los cambios son inevitables, pero no deben romper a sus clientes.


Siempre verifique sus APIs, deténgase cuidadosamente y comunique de forma proactiva para evitar interrupciones innecesarias.

Relaciones

https://hackernoon.com/misusing-http-status-codes-wrecks-your-api-monitoring-and-client-logic

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iv-7sc3w8n

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxiv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxv

Disclaimer

Los olores son míosOpinión.

Créditos

Fotografía porGiancarlo RevolledoesUnosplash


Las APIs son para siempre, así que diseñarlas cuidadosamente

Las APIs son para siempre, así que diseñarlas cuidadosamente

Martin Fowler


Este artículo es parte de la serie CodeSmell.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks
OSZAR »