Ir para o conteúdo principal

[Gov.Doc-API] Implementar middleware personalizado

Data de elaboração 13/01/2023
Responsável pelo estudo

Nara Carolina Galvão Feitosa

Raissa de Sousa Stodulski
Taillon Miguel Gonçalves
Ádelle Camarão Monteiro

Equipe do estudo Tambakiss
Alvo Gov.Doc API
Origem

Implementação, para facilitar alteraçnovas integrações napois APIestará sempadronizando afetaros sistemasretornos queesperados integramdos atualmenteendpoints, comfacilitando o projetoentendimento e tratamento dos mesmos.

Objetivo Com o versionamento,middleware personalizado, facilitar novas implementaçintegrações na API pois estará minimizandopadronizando e simplificando os impactosretornos nos sistemas que já integram com API.esperados.
Documentação correlata (opcional)
Observações


A. Introdução

Para facilitar novas implementações e alterações no Gov.Doc API, propõem-se implementar versionamento na API, pois é um padrão utilizado em todo o mundo nas APIs independentemente das tecnologias utilizadas. Assim sendo, objetivo desse estudo é analisar as possibilidades de implementação, identificar as possíveis alterações e levantar as demandas necessárias.


1. O que é versionamentomiddleware

"[É o processocomponente que] podemos usar para interceptar a solicitação, e assim, modificá-la enquanto ela passa pelo sistema. Os componentes de atribuirmiddleware, organizados em uma cadeia, formam o pipeline de solicitação. Esses componentes são escritos (ou registrados) no método “Configure” da classe “StartUp”. Neste caso, existem basicamente dois tipos de componentes de middleware. Componentes de middleware padrão (integrados) e personalizados." (Jesus, Daniel)

"Em termos práticos, middleware seria um nome único ou uma numeração única para indicar o estado da API. Facilita a identificaçãotrecho de erros e permite alterações significativas, minimizando o impacto nas integrações com sua API. 

  • Alguns benefícios:
      • Permite ter um mecanismo simplescódigo que facilitepode aser implementaçãoexecutado no fluxo de conceitos de DEVOPS, como CI (Continous Integrations) e CD (Continuous Delivery).
      • A abordagem preferida de utilizaçexecução da versãaplicação. [São]  organizados em um pipeline e são executados conforme uma solicitação é arecebida e uma resposta enviada. A imagem abaixo ilustra este pipeline:" (Nascimento, Wladimilson)

        image.png

        É possível definir middleware de URLdiversas via PATH pois pode ser responsável pela estabilidade estrutural da API, efuncionalidades, por pacotesexemplo, maioresno trecho de atualizações.

      • código
      abaixo,
    • temos
    oito
  • middlewares:

1. Exception/error handling2. HTTP Strict Transport Security Protocol3. HTTPS redirection
4. Static file server
5. Cookie policy enforcement
6. Authentication
7. Session
8.MVC

[xxxxxxxxxxxxxxx]

2. QuandoExemplos implementarde implementação

Se é uma API que possui várias integrações ou se tem grande impacto nos sistemas que integram com ela, é de grande valia implementar o versionamento. O mesmo, permite que ao longo das alterações que a API sofre, você possa gradualmente descontinuando funcionalidades e permitindo que novas implementações não impactem integrações existentes com a API. O melhor momento para implementação é na criação da API.

Foi identificado a necessidade de implementar o versionamento devido aos seguintes cenários:

  • "Já se deparou com uma situação terrível de ter desenvolvido um sistema que consome algum tipo de API, e ele parar de funcionar, pois o serviço que o sistema consumia foi atualizado? Ou também em uma outra ótica para quem desenvolve as APIs, aquela discussão árdua para atualiza-la, criando até comitês de inúmeras pessoas (clientes), discutindo horas somente para atualizar um atributo que é necessário para uma situação (cliente) e para outro não faz sentido a alteração?". 

3. Opções de implementação

Há três possíveis implementações:

  • URL, versão por Path
    • Exemplo: https://api-v1.minhagastronomia/vinhos ou https://api.minhagastronomia/v1/vinhos
    • Prós e Contras
      • Prós Contras
        1. É a opção mais utilizada do mercado 1. Adiciona comprimento à sua rota 

        2. É muito mais claro e simples. Além de dar um visual mais clean na URL, facilita a navegação para outras versões da API. É mais dev-friendly comparado a outras abordagens.


        3. Muitos frameworks oferecem suporte à esse versionamento
        4. Você pode facilmente estruturar sua API para permitir o versionamento por rota
  • Accept headers, o header customizado
    • Exemplo: Accept-Version: v2
    • Prós e Contras
      • Prós Contras
        1. A priori, uma solução fácil. 1. Obriga a informar cabeçalhos personalizados 
        2. Se formos seguir a especificação ao pé da letra, essa é a maneira correta de fazer o versionamento de APIs. 2. Não é dev-friendly, pois a requisição tem que ser feita com muito mais cuidado.
        3. É que sua URL permanece clean e intacta.
  • Query string, passar por parâmetro na URL
    • Exemplo: /products/product-name?version=v2
    • Prós e Contras
      • Prós Contras
        1. É uma abordagem que já foi muito utilizada. 1. Caiu em desuso. É conhecida como má prática por muitos desenvolvedores.

        2. Além de prejudicar a navegação para outras versões, a legibilidade da URL fica ruim em cenários de muitos parâmetros na query string


4. Implementando

Algumas possibilidades e sugestões de implementação levantadas.

  • Pode se implementar utilizando os pacotes disponíveis: WebApi.Versioning e Mvc.Versioning

  • Código
    Para uma implementação super fácil (com ASP.NET Core)


    image.png

    Para quando possui uma API mas não possui versionamento  

    image.png

    Quando há 3 versões mas somente 2 controllers, é possível implementar mais de uma versão por controller.


    image.png

    Para descontinuar o uso de uma versão no endpoint.


    image.png

    image.png

    Implementar status 301 - Moved permanently.

    Indica que o endpoint com a URI solicitada foi movida permanentemente para outra URI.

    Pode ser usado para indicar o uso de uma versão de API obsoleta / sem suporte.


5. Alterações necessárias 

A sugestão é criar uma nova controller com versionamento, levar os endpoints do Gov.Doc (somente utilizados por ele) para ela, criar uma padronização para atuais/futuros projetos (como é elaborada o número da versão, como será a organização de endpoint e os retornos - HTTP status code) e por fim, montar um calendário para descontinuar controller não versionada.

  • Criar pasta dentro de Controllers para cada versão.
  • Para cada controller:
    • Criar nova controller dentro da pasta /Controller/v2 com a mesma nomenclatura.
    • Mover controller antiga para dentro da pasta /Controller/v1.
    • Adicionar [ApiVersion("2")] e [Route("v{version:apiVersion}/[controller]")] na nova controller 
    • Mover endpoints utilizados pelos Gov.Doc (frontend) para a versão 2.
  • Criar pasta dentro de Services e Dtos para cada versão
  • Elaborar calendário com datas:
    • Para subir versão 2.0 para development, staging e production
    • Para descontinuar endpoints sem versão

B. Conclusão

Concluímos que essas são alterações necessárias para implementar o versionamento e que irá agregar grande valor para as APIs que aplicarem. Permitirá entregas mais fluídas e de menor impacto.


Fontes
  1. "AsAprendendo melhoresos práticas para controlecomponentes de versõesMiddleware emdo APIsAsp REST.Net Core -Parte 1", NeiltonDaniel Rocha.Jesus.
  2. "VersionandoCompreendendo APIsos RESTfulmiddlewares no ASP.NET Core", ThiagoWladimilson Lima.M. Nascimento.
  3. "ASP.NET Core RESTful Web API versioning made easy", Scott Hanselman.
  4. "A importância do versionamento de APIs", Patrick Francis Gomes Rocha.