Estratégias de Versionamento de API - Design que Mantém a Compatibilidade

12 min leitura | 2025.12.14

O que é Versionamento de API

Versionamento de API é um mecanismo para evoluir APIs sem quebrar clientes existentes. Ao introduzir mudanças que quebram compatibilidade, permite que versões antigas e novas coexistam, possibilitando que os clientes migrem em seu próprio ritmo.

Por que é necessário: Quando você publica uma API, muitos clientes passam a depender dela. Mudanças repentinas podem quebrar aplicações clientes e prejudicar a confiança.

O que são Mudanças que Quebram Compatibilidade

As seguintes mudanças podem quebrar o funcionamento de clientes existentes.

Exemplos de Mudanças que Quebram Compatibilidade

TipoAntesDepoisProblema
Remoção de campo{ "name": "Alice", "age": 30 }{ "name": "Alice" }age foi removido
Renomeação de campo{ "userName": "alice" }{ "username": "alice" }camelCase → snake_case
Mudança de tipo{ "id": 123 }{ "id": "123" }número → string
Adição de parâmetro obrigatórioPOST /users { "name": "Alice" }POST /users { "name": "Alice", "email": "..." }email tornou-se obrigatório
Mudança de endpointGET /usersGET /membersURL alterada

Exemplos de Mudanças Não Destrutivas

  • ✓ Adição de novos campos opcionais
  • ✓ Adição de novos endpoints
  • ✓ Adição de novos parâmetros opcionais

Métodos de Versionamento

1. Versionamento por Caminho de URL

GET /api/v1/users
GET /api/v2/users

Vantagens:

  • Claro e intuitivo
  • Fácil de cachear
  • Fácil de testar no navegador

Desvantagens:

  • Alguns argumentam que viola os princípios REST por mudar a URI
  • URI do recurso não é fixa

Exemplos de uso: GitHub API, Twitter API, Stripe API

2. Versionamento por Header

GET /api/users
Accept: application/vnd.myapi.v1+json

Ou

GET /api/users
X-API-Version: 1

Vantagens:

  • URI limpa
  • Segue o padrão de content negotiation

Desvantagens:

  • Difícil de testar no navegador
  • Documentação menos clara

Exemplos de uso: GitHub API (parcialmente)

3. Versionamento por Parâmetro de Query

GET /api/users?version=1
GET /api/users?version=2

Vantagens:

  • Fácil de implementar
  • Fácil de definir versão padrão

Desvantagens:

  • Fácil de esquecer o parâmetro
  • Requer consideração de cache

Exemplos de uso: Google APIs (parcialmente)

Tabela Comparativa

MétodoClarezaConformidade RESTCacheDificuldade de Implementação
Caminho URLFácil
HeaderModerada
Parâmetro de QueryFácil

Melhores Práticas de Estratégia de Versão

1. Evite Versionamento Sempre que Possível

// Design extensível
// Adicionar novos campos não afeta clientes existentes
{
  "name": "Alice",
  "email": "alice@example.com",
  // Adicionar novo campo
  "profile": {
    "bio": "Developer"
  }
}

2. Processo de Depreciação

# Notifica depreciação via headers de resposta
Deprecation: true
Sunset: Sat, 31 Dec 2025 23:59:59 GMT
Link: <https://api.example.com/v2/users>; rel="successor-version"

3. Definição de Período de Migração

MarcoDataObservações
Lançamento v1Janeiro 2024
Lançamento v2Junho 2024
Depreciação v1Setembro 20243 meses de operação paralela
Descontinuação v1Janeiro 20251 ano de suporte

4. Publicação de Changelog

## Changelog

### v2.0.0 (2024-06-01)
**Breaking Changes:**
- Dividido `user.name` em `user.firstName` e `user.lastName`
- Alterado formato de resposta de `GET /users/:id/posts`

**Migration Guide:**
- Se estiver usando o campo `name`, altere para `firstName + ' ' + lastName`

Técnicas para Manter Compatibilidade

Adição de Campos é Segura

// v1
{ "id": 1, "name": "Alice" }

// v1.1 - Clientes existentes ignoram novos campos
{ "id": 1, "name": "Alice", "email": "alice@example.com" }

Campos Nullable e Valores Padrão

// Novos campos são nullable ou têm valores padrão
{
  "id": 1,
  "name": "Alice",
  "nickname": null,  // Opcional
  "isActive": true   // Valor padrão
}

Padrão Envelope

// Envolver resposta garante extensibilidade
{
  "data": { "id": 1, "name": "Alice" },
  "meta": { "version": "1.0", "requestId": "abc123" }
}

Resumo

O versionamento de API é uma estratégia importante para equilibrar a evolução da API com a estabilidade do cliente. O versionamento por caminho de URL é o mais comum e claro, mas escolha o método apropriado de acordo com os requisitos do projeto. O mais importante é buscar um design extensível que minimize a necessidade de versionamento.

← Voltar para a lista