Tipos de mudanças
Veja o que consideramos como mudanças disruptivas.
Introdução
O objetivo deste documento é detalhar quando uma ou mais mudanças nas nossas APIs serão consideradas:
- disruptivas (breaking changes), o que exigirá a criação de uma nova versão maior (major); ou
- não disruptivas (non breaking changes), o que exigirá a criação de uma nova versão menor (minor) ou de correção (patch).
Política de versionamento
Conheça nossa Política de versionamento.
Mudanças em APIs REST podem ocorrer:
- no contrato da API (Open API 3.0), tendo efeitos mais visíveis aos consumidores e, portanto, sendo mais fácil de se mapear os seus impactos; ou
- em suas regras de negócio/implementação, precisando de uma análise mais complexa de quando uma mudança traz impactos aos atuais consumidores das APIs.
Por se basear no protocolo HTTP, uma API REST é composta de vários elementos que podem ser alterados causando impactos aos seus consumidores. Veja a seguir:
Request
verbo
;schema
;recurso
;pathParams
;queryParams
;headers
; ebody
.
Estrutura padrão:
<VERBO> <schema>://<host>:<porta>/<uri>/<pathParam>?<queryParam>=ipsum#\<seção>
<header>: ipsum loren
<body>
Response:
status code
;headers
; ebody
.
Estrutura padrão:
<HTTP Status>
<Header>: ipsum loren
<body>
Callbacks (webhooks)
pathParams
;queryParams
;headers
;body
;próprio uso do webhook
.
Estrutura padrão:
<VERBO> <schema>://<callbackUri>/<pathParam>?<queryParam>=ipsum
<header>: ipsum loren
<body>
Mudanças disruptivas (breaking changes)
1. Remover um recurso
Exemplo: a API originalmente define três recursos e na nova versão exclui o recurso 2.
Versão 1 | Versão 2 |
---|---|
/api/v1/recurso1 | /api/v2/recurso1 |
/api/v1/recurso2 | |
/api/v1/recurso3 | /api/v2/recurso3 |
2. Remover um verbo de um recurso (operação)
Exemplo: a API originalmente define um recurso com três operações e na nova versão uma das operações foi removida.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1 | GET /api/v2/recurso1 |
GET /api/v1/recurso1/{id} | GET /api/v2/recurso1/{id} |
PUT /api/v1/recurso1/{id} | PUT /api/v2/recurso1/{id} |
3. Alterar o verbo de um recurso (operação)
Exemplo: a API originalmente define um recurso com o verbo PUT
e na nova versão ele é alterado para PATCH
.
Versão 1 | Versão 2 |
---|---|
PUT /api/v1/recurso1/{id} | PATCH /api/v2/recurso1/{id} |
4. Remover um path
Exemplo: a API originalmente define um path para acessar apenas os dados do subrecurso2 com facilidade. A nova versão remove este path.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1/{id} | GET /api/v2/recurso1/{id} |
GET /api/v1/recurso1/{id}/subrecurso1 | GET /api/v2/recurso1/{id}/subrecurso1 |
GET /api/v1/recurso1/{id}/subrecurso2 |
5. Remover um parâmetro do request (pathParam e/ou queryParam)
Exemplo 1: a API originalmente define um pathParam que identifica o recurso. A nova versão não possui mais este parâmetro, não sendo mais possível identificar o recurso.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1/{id}/subrecurso1 | GET /api/v2/recurso1/subrecurso1 |
Exemplo 2: a API originalmente define como queryParam um filtro. A nova versão não possui mais este filtro.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?filter=lorem | GET /api/v2/recurso1 |
6. Renomear um parâmetro (queryParam e/ou body)
Exemplo 1: a API originalmente define como queryParam um filtro. A nova versão renomeia este filtro.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?filter=lorem | GET /api/v1/recurso1?renamedfilter=ipsum |
7. Adicionar um parâmetro obrigatório no request (pathParam, queryParam e/ou body)
Exemplo 1: a API originalmente define um recurso. A nova versão acrescenta um pathParam.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1 | GET /api/v2/recurso1/{id} |
Exemplo 2: a API originalmente define um recurso. A nova versão acrescenta um queryParam.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1 | GET /api/v2/recurso1?filter=lorem |
8. Alterar local onde um parâmetro é recebido
Exemplo 1: A API originalmente recebe um parâmetro no body e, na nova versão, é esperado como um query param.
Versão 1 | Versão 2 |
---|---|
|
|
Exemplo 2: A API originalmente recebe um query param e, na nova versão, é esperado como um path param.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?id=123 | GET /api/v2/recurso1/123 |
9. Alterar um parâmetro do tipo enum (adicionar ou remover valores)
Exemplo 1: Adicionar ou remover valores das opções possíveis entre as versões da API.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?status=ativo | GET /api/v2/recurso1?status=novo |
Exemplo 2:
Versão 1 | Versão 2 |
---|---|
|
|
10. Remover o suporte a um tipo de conteúdo (content-type) previamente aceito no request
Exemplo: A API originalmente dava suporte a um tipo de conteúdo no request e, na versão nova, deixa de dar.
Versão 1 | Versão 2 |
---|---|
|
|
11. Remover o suporte a um tipo de conteúdo (content-type) previamente aceito no response
Exemplo: A API originalmente dava suporte a um tipo de conteúdo no response e, na nova versão, deixa de dar.
Versão 1 | Versão 2 |
---|---|
|
|
12. Adicionar um header obrigatório no request
Exemplo: A API originalmente não continha um header e, na nova versão, um novo header obrigatório é adicionado ao request.
Versão 1 | Versão 2 |
---|---|
|
|
13. Remover um header do response
Exemplo: A API originalmente continha um header no response e, na nova versão, o header foi removido.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1 | GET /api/v2/recurso1 |
14. Alterar a estrutura do body (request, response e/ou webhook)
Exemplo 1: A API originalmente tinha uma estrutura de request e, na nova versão, essa estrutura foi alterada (o que pode incluir alterações na estrutura JSON, tipos de dados ou nomes de campos).
Versão 1 | Versão 2 |
---|---|
|
|
Exemplo 2: A API originalmente tinha uma estrutura de response e, na nova versão, essa estrutura foi alterada (o que pode incluir alterações na estrutura JSON, tipos de dados ou nomes de campos).
Versão 1 | Versão 2 |
---|---|
|
|
Exemplo 3: A API originalmente tinha uma estrutura de webhook e, na nova versão, essa estrutura foi alterada (o que pode incluir alterações na estrutura JSON, tipos de dados ou nomes de campos).
Versão 1 | Versão 2 |
---|---|
|
|
15. Alterar o tipo de um parâmetro (pathParam, queryParam, header e/ou body)
Exemplo 1: A API originalmente considerava determinado parâmetro como string e, na nova versão, o tipo desse parâmetro foi modificado para inteiro.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1/idade/25 | GET /api/v2/recurso1/idade/25 |
Exemplo 2: A API originalmente considerava determinado parâmetro como string e, na nova versão, o tipo desse parâmetro foi modificado para booleano.
Versão 1 | Versão 2 |
---|---|
|
|
Exemplo 3: A API originalmente considerava determinado parâmetro como string e, na nova versão, o tipo desse parâmetro foi modificado para data.
Versão 1 | Versão 2 |
---|---|
|
|
16. Alterar o formato de um parâmetro (pathParam, queryParam, header e/ou body)
Exemplo 1: A API originalmente utilizava um pathParam
e, na nova versão, passou autilizar um queryParam
.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1/data/2022-01-01 | GET /api/v2/recurso1?data=01-01-2022 |
Exemplo 2: A API originalmente utilizava um parâmetro no body e, na nova versão, passou autilizar no header.
Versão 1 | Versão 2 |
---|---|
|
|
Exemplo 3: A API originalmente utilizava um parâmetro com determinado formato e, na nova versão, passou a utilizar outro formato.
Versão 1 | Versão 2 |
---|---|
|
|
17. Aumentar as restrições de um parâmetro no request (pathParam, queryParam, header e/ou body)
Exemplo: A API originalmente utilizava um parâmetro opcional e, na nova versão, essas restrições foram aumentadas tornando-o obrigatório.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1 | GET /api/v2/recurso1/{id} |
GET /api/v1/recurso1 | GET /api/v2/recurso1?filter=lorem |
GET /api/v1/recurso1 | GET /api/v2/recurso1/{id}/detalhes |
18. Diminuir as restrições de um parâmetro no response (body)
Exemplo: A API originalmente utilizava um parâmetro obrigatório e, na nova versão, essas restrições foram diminuídas tornando-o opcional.
Versão 1 | Versão 2 |
---|---|
|
|
19. Alterar o valor padrão de um parâmetro opcional
Exemplo: A API originalmente utilizava determinado valor padrão para um parâmetro opcional e, na nova versão, esse valor foi alterado.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?limite=10 | GET /api/v2/recurso1?limite=20 |
20. Alterar a forma de representar arrays nos parâmetros (queryParam)
Exemplo: A API originalmente representava arrays de uma forma e, na nova versão, essa representação foi alterada.
Versão 1 | Versão 2 |
---|---|
GET /api/v1/recurso1?itens=1&itens=2&itens=3 | GET /api/v2/recurso1?itens\[]=1&itens\[]=2&itens\[]=3 |
21. Adicionar um novo código HTTP de response
Exemplo: A API originalmente não retornava um HTTP Status Code
e, na nova versão, passou a retornar.
Versão 1 | Versão 2 |
---|---|
|
|
22. Remover um código HTTP de response
Exemplo: A API originalmente retornava um HTTP Status Code
e, na nova versão, deixou de retornar.
Versão 1 | Versão 2 |
---|---|
|
|
23. Modificar o código HTTP de um response existente
Exemplo: A API originalmente retornava um HTTP Status Code
e, na nova versão, ele foi alterado.
Versão 1 | Versão 2 |
---|---|
|
|
24. Adicionar/remover o uso de callbacks (webhooks) assíncronos
Exemplo: A API originalmente retornava uma resposta assíncrona e, na nova versão, deixou de retornar.
Versão 1 | Versão 2 |
---|---|
|
|
Mudanças não disruptivas (non breaking changes)
Quaisquer mudanças que não se enquadrem na lista de mudanças disruptivas serão consideradas não disruptivas.
Updated about 1 month ago