Compartir en Twitter
Go to Homepage

GUÍA COMPLETA PARA VERSIONAR UNA API REST

October 14, 2025

Introducción al Versionado de APIs REST

El versionado de APIs REST es un tema crítico en el desarrollo de aplicaciones modernas, especialmente cuando se trata de garantizar la estabilidad y la compatibilidad para los consumidores de una API. En un entorno donde las aplicaciones dependen de interfaces para intercambiar datos, cualquier cambio en la estructura o comportamiento de una API puede generar problemas significativos. Este tutorial explora las razones detrás del versionado de APIs, las estrategias para implementarlo de manera efectiva y cómo gestionar los cambios sin interrumpir a los usuarios. A través de ejemplos prácticos y principios claros, aprenderás a manejar contratos de datos y cambios disruptivos, asegurando que tu API sea robusta y confiable.

¿Qué es el Versionado de APIs?

El versionado de APIs es la práctica de gestionar cambios en una API de forma transparente, permitiendo a los consumidores entender y adaptarse a las modificaciones. En esencia, se trata de comunicar de manera clara cualquier cambio en la forma en que se entregan los datos o se procesan las solicitudes, asegurando que los sistemas que dependen de la API no fallen inesperadamente.

El versionado efectivo implica manejar contratos de datos, que son los acuerdos sobre la estructura y contenido de los datos intercambiados, y los cambios disruptivos, que obligan a los consumidores a modificar sus aplicaciones. Por ejemplo, un contrato de datos puede definir que una respuesta JSON contiene un arreglo de productos con propiedades específicas, como se muestra a continuación:

{
    "data": [
        {
            "id": 1,
            "name": "Producto 1"
        },
        {
            "id": 2,
            "name": "Producto 2"
        }
    ]
}

En este caso, el contrato de datos especifica que la respuesta tiene una propiedad data que contiene un arreglo de objetos, cada uno con un id (entero) y un name (cadena). Cambiar el nombre de data a body o el tipo de id a un GUID rompería este contrato, afectando a los consumidores.

¿Por Qué es Necesario el Versionado?

El versionado es esencial porque incluso los cambios más pequeños en una API pueden tener consecuencias significativas. Por ejemplo, renombrar una propiedad de productId a productID puede romper aplicaciones que dependen de la estructura original. Estos cambios disruptivos ocurren cuando se modifica el contrato de datos de manera que fuerza a los consumidores a actualizar su código.

Los cambios disruptivos más comunes incluyen:

  1. Cambiar el formato de solicitud o respuesta (por ejemplo, de XML a JSON).
  2. Modificar el nombre o tipo de una propiedad (por ejemplo, de name a productName o de entero a flotante).
  3. Agregar un campo obligatorio en la solicitud (como un nuevo encabezado requerido).
  4. Eliminar una propiedad de la respuesta (como quitar description de un producto).

Un ejemplo práctico de un cambio disruptivo sería el siguiente. Supongamos que una API inicialmente devuelve:

{
    "productId": 1,
    "name": "Producto 1"
}

Si el equipo cambia productId a productID, los consumidores que esperan productId encontrarán errores. Para evitar esto, el versionado permite introducir cambios sin afectar a los usuarios existentes.

Gestión de Cambios en APIs

Antes de profundizar en las estrategias de versionado, es importante entender cómo gestionar los cambios para minimizar la necesidad de nuevas versiones. La gestión de cambios en APIs se basa en tres principios fundamentales:

  1. Mantener el soporte para propiedades y endpoints existentes.
  2. Agregar nuevas propiedades o endpoints en lugar de modificar los existentes.
  3. Retirar propiedades o endpoints obsoletos de manera planificada.

Un ejemplo de aplicación de estos principios sería una respuesta JSON para un endpoint de usuarios:

{
    "data": {
        "id": 1,
        "name": "Carlos Ray Norris",
        "firstName": "Carlos",
        "lastName": "Norris",
        "alias": "Chuck",
        "aliases": ["Chuck", "Walker"]
    },
    "meta": {
        "fieldNotes": [
            {
                "field": "alias",
                "note": "Se eliminará el 2026-01-01. Usa aliases."
            }
        ]
    }
}

En este caso, se mantienen propiedades originales como name, se agregan nuevas (firstName, lastName, aliases) y se marca alias como obsoleto con una fecha de eliminación. Este enfoque permite a los consumidores adaptarse gradualmente sin romper sus aplicaciones.

Estrategias para Versionar APIs

Cuando un cambio disruptivo es inevitable, el versionado se convierte en la solución. La clave está en elegir una estrategia que sea clara y fácil de implementar. A continuación, exploramos las principales estrategias de versionado, sus ventajas y desventajas, y cómo aplicarlas según el alcance del cambio.

Alcance del Versionado

Antes de elegir una estrategia, es crucial determinar el alcance del cambio. Los cambios en una API pueden clasificarse en cuatro niveles, utilizando la analogía de un árbol:

  1. Hoja: Cambios en un endpoint aislado sin relación con otros.
  2. Rama: Cambios en un grupo de endpoints o un recurso accedido por varios endpoints.
  3. Tronco: Cambios a nivel de la aplicación que afectan a la mayoría o todos los endpoints.
  4. Raíz: Cambios que afectan el acceso a todos los recursos de todas las versiones de la API.

Por ejemplo, un cambio en un endpoint específico, como /products, sería un cambio de hoja. Si el cambio afecta a un recurso como variants accesible desde múltiples rutas (/variants, /products/:id/variants), sería un cambio de rama. Un cambio de formato global (de XML a JSON) sería un cambio de tronco, mientras que un cambio en el método de autenticación afectaría la raíz.

Tipos de Versionado

Existen varias estrategias para versionar APIs, cada una con sus fortalezas y debilidades. A continuación, se detallan las más comunes.

Versionado en la Ruta URI

El versionado en la ruta URI es la estrategia más común y consiste en incluir el número de versión en la URL, generalmente con un prefijo como v. Ejemplo:

http://api.example.com/v1/products
http://api.example.com/v2/products

Esta estrategia es clara y fácil de entender, ya que la versión es visible en la URL. Sin embargo, suele usarse para indicar la versión de la aplicación completa (tronco) en lugar de endpoints individuales (hoja o rama). Esto puede generar confusión si, por ejemplo, /v1/products está en la versión 1, pero /v1/variants está en la versión 3.

El versionado en la ruta URI implica lanzar versiones completas de la API, lo que requiere mantener la versión anterior mientras se desarrolla la nueva o forzar a los consumidores a esperar la nueva versión para acceder a recursos actualizados. Es una buena opción para APIs con baja volatilidad, pero puede ser problemático para APIs con cambios frecuentes.

Versionado con Parámetros de Consulta

El versionado con parámetros de consulta agrega un parámetro version a la URL. Ejemplo:

http://api.example.com/products?version=1
http://api.example.com/products?version=2

Esta estrategia es flexible, ya que permite especificar la versión de un recurso específico sin afectar la estructura de la URL. Es ideal para cambios de hoja, pero no refleja la versión global de la API, lo que puede generar inconsistencias si no se gestiona adecuadamente.

Versionado en Encabezados

El versionado en encabezados utiliza un encabezado HTTP, como Accept, para especificar la versión. Ejemplo:

Accept: version=1.0

Esta estrategia ofrece granularidad, ya que permite solicitar una versión específica de un recurso sin modificar la URL. Sin embargo, es menos visible que las otras opciones, ya que la versión está en los encabezados de la solicitud, lo que puede dificultar la depuración. Además, no siempre es claro si la versión se refiere al endpoint o a la API completa.

Enfoque Híbrido

Para APIs más complejas, se puede combinar el versionado en la ruta URI y parámetros de consulta o usar encabezados avanzados. Ejemplo:

# Ruta URI y parámetros de consulta
http://api.example.com/v1/products?version=1
http://api.example.com/v1/products?version=2

# Encabezados avanzados
Accept: api-version=1; resource-version=1
Accept: api-version=1; resource-version=2

Este enfoque híbrido permite manejar versiones globales (tronco) y versiones de recursos específicos (hoja o rama), ofreciendo flexibilidad y claridad. Por ejemplo, api-version=1 indica la versión de la API, mientras que resource-version=2 especifica la versión del recurso products.

Mejores Prácticas para el Versionado

Para implementar un versionado efectivo, considera las siguientes mejores prácticas:

  1. Documenta claramente los cambios: Proporciona documentación detallada sobre las diferencias entre versiones, incluyendo ejemplos de contratos de datos.

  2. Comunica con anticipación: Notifica a los consumidores sobre cambios y fechas de eliminación de endpoints o propiedades obsoletas.

  3. Prueba los cambios: Usa pruebas automatizadas para detectar cambios disruptivos antes de que afecten a los consumidores.

  4. Evita versiones innecesarias: Aplica los principios de gestión de cambios para minimizar la necesidad de nuevas versiones.

  5. Mantén la compatibilidad: Soporta versiones antiguas durante un período razonable para permitir a los consumidores adaptarse.

Un ejemplo práctico de documentación clara sería incluir una nota en la respuesta de un endpoint que está por ser obsoleto:

{
    "data": {
        "id": 1,
        "name": "Producto 1"
    },
    "meta": {
        "deprecation": "Este endpoint será eliminado el 2026-06-01. Usa /v2/products."
    }
}

Conclusiones

El versionado de APIs REST es una práctica esencial para garantizar la estabilidad y la confianza de los consumidores en un entorno de desarrollo dinámico. Al comprender los contratos de datos y los cambios disruptivos, los desarrolladores pueden implementar estrategias de versionado que minimicen interrupciones. Ya sea utilizando el versionado en la ruta URI, parámetros de consulta, encabezados o un enfoque híbrido, la clave está en mantener la transparencia y la comunicación con los consumidores. Aplicar principios de gestión de cambios, como mantener propiedades existentes, agregar nuevas opciones y retirar obsoletas de manera planificada, puede reducir la necesidad de nuevas versiones. Con una planificación cuidadosa y una documentación clara, puedes construir y mantener APIs robustas que evolucionen sin comprometer la experiencia del usuario.