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
| Tipo | Antes | Depois | Problema |
|---|---|---|---|
| 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ório | POST /users { "name": "Alice" } | POST /users { "name": "Alice", "email": "..." } | email tornou-se obrigatório |
| Mudança de endpoint | GET /users | GET /members | URL 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étodo | Clareza | Conformidade REST | Cache | Dificuldade de Implementação |
|---|---|---|---|---|
| Caminho URL | ◎ | △ | ◎ | Fácil |
| Header | △ | ◎ | ○ | Moderada |
| Parâmetro de Query | ○ | △ | △ | Fá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
| Marco | Data | Observações |
|---|---|---|
| Lançamento v1 | Janeiro 2024 | |
| Lançamento v2 | Junho 2024 | |
| Depreciação v1 | Setembro 2024 | 3 meses de operação paralela |
| Descontinuação v1 | Janeiro 2025 | 1 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